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

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

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

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

Q&A

解決済

1回答

2351閲覧

同じコンポーネントを二個呼び出して異なる関数を渡すと、一つ目のコンポーネントが二つ目のコンポーネントに渡した関数を実行してしまいます。

退会済みユーザー

退会済みユーザー

総合スコア0

React.js

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

0グッド

0クリップ

投稿2020/04/04 10:50

編集2020/04/04 10:53

実現したいこと

ソースコードです。

import * as React from 'react'; import Btn from '../presentational/atoms/Btn'; import Form from '../presentational/atoms/Form'; import TodoList from '../presentational/molecules/TodoList'; interface IState { count: number; todos: string[]; value: string; } export default class Todo extends React.Component<{}, IState> { constructor(props) { super(props); this.state = { count: 0, todos: [], value: '' } } addTodo = () => { const {todos, value } = this.state; this.setState({ todos: [...todos, value] }) } changeValue = (e) => { this.setState({ value: e.target.value }); } removeTodo = (index) => { const {todos} = this.state; this.setState({ todos: [...todos.slice(0, index), ...todos.slice(index + 1)] }) } render() { return( <> <div className="l-flex"> <Form onChangeFunction={this.changeValue} value={this.state.value} /> <Btn text="ADD!" onClickFunction={this.addTodo} /> </div> <TodoList todos={this.state.todos} onClickFunction={this.removeTodo} /> </> ); } }
import * as React from 'react'; import Btn from '../atoms/Btn'; const TodoList = (props) => { return( <ul className="list l-flex"> {props.todos.map((todo, index) => <li key={index} className="list-item l-flex"> <i className="far fa-square list-icon"></i> <p>{todo}</p> <Btn text="remove!" onClickFunction={props.onClickFunction(index)} /> </li> )} </ul> ); } export default TodoList;

1つ目のソースコードで二つのBtnコンポーネントを呼び出しています。(TodoListを呼び出して間接的にBtnコンポーネントを呼び出しています)
片方にはaddTodo関数を、もう片方にはremoveTodo関数を渡しています。
一つ目のBtnをクリックすると、addTodo関数が実行されてtodoリストに追加されるはずです。しかしremoveTodo関数が実行されてしまいます。二つ目のBtnをクリックしても何も起こりません。
この不具合を解消したいです。

19:50追記

少し異なっていました。
1つ目のコンポーネントを押すと、addTodo関数とremoveTodo関数が同時に実行されているようです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

onClickFunction={props.onClickFunction(index)}のように書くと、renderした瞬間にprops.onClickFunctionを実行することになってしまいます。

とりあえずは、onClickFunction={() => props.onClickFunction(index)}のようにして関数を渡すようにしてみてはどうでしょうか?

投稿2020/04/04 11:03

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2020/04/04 11:24

ありがとうございます。この方法で無事解決しました! propsで関数を受け取った時は、そのような形にしなければいけない。という解釈で合っていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問