質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1058閲覧

Reactでemitが効かない

vnsa7221

総合スコア348

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/08/29 03:13

編集2021/08/29 03:21

前提・実現したいこと

こちらの記事を元に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を用いて勉強しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

TodoStore を 2 回 new しているため、store.ts から export してるもの (App で使ってるもの) と、グルーバル変数に設定したもの (console から呼び出すもの) が別々だからですね。

diff

1 const todoStore = new TodoStore(); 2 3 // デバックのためconsoleから呼び出せるよう追記 4-window.todoStore = new TodoStore(); 5+window.todoStore = todoStore; 6 export default todoStore;

投稿2021/08/29 04:14

hoshi-takanori

総合スコア7899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vnsa7221

2021/08/29 04:37

こちらいただいた修正方法で解決しました。ありがとうございます。 emitの使い方が悪いのかとずっと調べてましたが、それ以前の初歩的なミスでした。。。 大変失礼いたしました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問