反応リンクコンポーネントでonClickイベントを使用するにはどうすればよいですか?


84

reactjsルーターからLinkコンポーネントを使用していますが、onClickeventを機能させることができません。これはコードです:

<Link to={this.props.myroute} onClick='hello()'>Here</Link>

これはそれを行う方法ですか、それとも別の方法ですか?

回答:


127

hello()文字列として渡すことは、すぐにhello()実行することも意味しhelloます。

試してみてください

onClick={hello}

32

これを使用する必要があります:

<Link to={this.props.myroute} onClick={hello}>Here</Link>

または(メソッドhelloがこのクラスにある場合):

<Link to={this.props.myroute} onClick={this.hello}>Here</Link>

更新: ES6以降で、クリックメソッドを使用してパラメーターをバインドする場合は、次を使用できます。

    const someValue = 'some';  
....  
    <Link to={this.props.myroute} onClick={() => hello(someValue)}>Here</Link>

4
またはそれ以上this.hello.bind(this)
webNeat 2017

4
^パフォーマンスの問題につながる可能性がある方法でバインドするため、実際には常にコンストラクターでアクションをバインドする必要があります。
ヌンチャク2018

1
リンク「to」が必要ですが、多くの場合、onClick()だけが必要<Link to="" onClick={this.delete}>Delete</Link>です。現在、のようなことをしなければなりません。ここで「to」がオプションであることを望みます。
ニューマン2018

2
@newmanなぜあなたはLinkなしで使うのtoですか?それが必要ない場合<button>は、onClickメソッドを使用したaなどの他のコンポーネントを使用すれば、問題ありません;)。
Guilherme Oderdenge 2018年

23

これは一般的に使用するのに適したパターンではないと思います。リンクはonClickイベントを実行してからルートに移動するため、新しいルートへの移動にはわずかな遅延が発生します。より良い戦略は、これまでと同じように「to」プロップを使用して新しいルートに移動することです。新しいコンポーネントのcomponentDidMount()関数で、hello関数またはその他の関数を起動できます。同じ結果が得られますが、ルート間の移行がはるかにスムーズになります。

コンテキストとして、ここにあるようにLinkのonClickイベントでreduxストアを更新しているときにこれに気づき、新しいルートのコンポーネントをマウントする前に、最大.3秒の空白の白い画面の遅延が発生しました。API呼び出しが含まれていなかったので、遅延が非常に大きいことに驚きました。ただし、コンソールロギング 'hello'だけの場合は、遅延が目立たない可能性があります。


現在のコンポーネントにコールバックURLがあり、onClick新しいルートに移行する前にCookieに保存しています。次のコンポーネントでそのコールバックURLを取得しないため、移行自体の前に取得する必要があります。それに代わるものはありますか?PS:コールバックURLは、更新後もアクセスできる必要があるため、ストアに保存できます。
Parth Mistry 2018年

1
react-navigationを使用している場合:Linkを使用せず、TouchableOpacityまたはTouchableWithoutFeedbackを使用するだけです。次に、onPress関数で、ナビゲーションしてURLをナビゲーションonPress={() => { this.props.navigation.navigate('NameOfNextScreen', { callbackUrl: 'http://.callbackUrl.com', });パラメーターとして渡すことができます。react -navigationを使用していない場合I LinkのonClickを使用するだけで、わずかなパフォーマンスの問題について心配する必要はありません。おそらく目立たないでしょう。
ヌンチャク2018年

いいアドバイス!ありがとう!
aspiringsoftwaredev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.