前提・実現したいこと
こちらの記事を元にReactのfluxを勉強中。
「動的にTodo リストが更新されるようにする」の部分でstore.jsにてemitを仕込み、consoleから動かしたが動的にリストが更新されず、原因不明。
発生している問題・エラーメッセージ
console にてcreateTodo メソッドを打ち込んで新しいTodo を登録してみても、新しいTodoが登録されない。
該当のソースコード
js
1// App.js(記事でいうTodo.jsに該当) 2import './App.css'; 3import React from 'react'; 4import Todo from './components/todo'; 5import TodoStore from './stores/store'; 6 7class App extends React.Component { 8 constructor() { 9 super(); 10 this.state = { 11 // title: 'welcome', 12 todos: TodoStore.getAll() 13 }; 14 } 15 16 // 初期化処理(storeの状態が変化したら再取得) 17 componentDidMount() { 18 TodoStore.on('change', () => { 19 console.log('=== TodoStore changed ==='); 20 this.setState({ 21 todos: TodoStore.getAll() 22 }); 23 }); 24 } 25 26 render() { 27 const { todos } = this.state; 28 29 const todoComponents = todos.map((todo) => { 30 return <Todo key={todo.id} {...todo} />; 31 }); 32 33 return ( 34 <div className="app"> 35 {/* step3 flux */} 36 <section className="contents"> 37 <h2>Step3 fluxについて</h2> 38 <ul> 39 { todoComponents } 40 </ul> 41 </section> 42 </div> 43 ); 44 } 45} 46 47export default App; 48 49
js
1// store.js(記事でいうTodoStore.js) 2import { EventEmitter } from 'events'; 3 4class TodoStore extends EventEmitter { 5 // todo task 6 constructor() { 7 super(); 8 this.todos = [ 9 { 10 id: 1630201746880, 11 text: 'Go Shopping', 12 complete: false 13 }, 14 { 15 id: 1630201754769, 16 text: 'Pay Bills', 17 complete: false 18 } 19 ]; 20 } 21 22 // todoリスト作成 23 createTodo(text) { 24 console.log("=== createTodo called ==="); 25 26 const id = Date.now(); 27 28 this.todos.push({ 29 id, 30 text, 31 complete: false 32 }); 33 34 console.log(this.todos); 35 this.emit('change'); 36 } 37 38 // todoリスト取得 39 getAll() { 40 return this.todos; 41 } 42} 43 44const todoStore = new TodoStore(); 45 46// デバックのためconsoleから呼び出せるよう追記 47window.todoStore = new TodoStore(); 48export default todoStore; 49
試したこと
createTodoが正常に呼び出されているか確認 -> === createTodo called ===が実行されることを確認
componentDidMount()が動いているか確認 -> === TodoStore changed ===が実行されていないことを確認
補足情報(FW/ツールのバージョンなど)
create-react-appを用いて勉強しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/29 04:37