2017-07-03 1 views
2

私は<ul>コンポーネントをラップしています。<li>コンポーネント。私は、それぞれlionClickハンドラを追加することを避け、代わりにulで1つのハンドラを使用し、バブリングされたイベントをキャプチャします。リアクションイベントバブリング:ターゲットを探す

バブリングされたイベントからクリックされたコンポーネントを特定/割り当てる正しい方法は何ですか?

class ListItemComponent extends React.Component { 
    public render() { 
     return (
      <li>Foo</li> 
     ) 
    } 
} 

class ListComponent extends React.Component { 
    private handleClick(event) { 
     const target = event.target; 
     // Determine clicked component, or index etc … ? 
    } 

    public render() { 
     const items = this.props.items.map((x, i) => { 
      <ListItemComponent active=“false” key={i} />  
     }) 
     return (
      <ul onClick={this.handleClick} /> 
       { items } 
      </ul> 
     ) 
    } 
} 
+0

あなたが反応に周り 'event'を渡すことはできません。 'event.target'をhandleClick関数に直接渡してください。 – jmargolisvt

+0

あなたはどのような解決策を提案しているのかよく分かりません。あなたは例を挙げることができますか?私が与えた例では、私は確かにイベントにアクセスすることができます。 – duncanhall

+0

私はちょうどあなたが本当に対処するのが難しいSyntheticEventを取得する周りのイベントを渡すときに言っている。 – jmargolisvt

答えて

0

私の解決策は、コンポーネントを識別するために使用できる各子にdata-index属性を追加することでした。

これは、複数のオーバーヘッドを回避しながら、子DOM要素を取得するためにrefコールバックを複数のイベントリスナーを追加回避:

class ListItemComponent extends React.Component { 
    public render() { 
     return (
      <li data-index={this.props.index}>Foo</li> 
     ) 
    } 
} 

class ListComponent extends React.Component { 
    private handleClick(event) { 
     const activeIndex = event.target.getAttribute('data-index'); 
     this.setState({ activeIndex }); 
    } 

    public render() { 
     const active = this.state.activeIndex; 
     const items = this.props.items.map((x, i) => { 
      <ListItemComponent active={i === active} key={i} index={i} />  
     }) 
     return (
      <ul onClick={this.handleClick} /> 
       { items } 
      </ul> 
     ) 
    } 
} 
-1

このようにid propのイテレータをliコンポーネントに渡します。

const items = this.props.items.map((x, i) => { 
     <ListItemComponent active=“false” key={i} id={i} />  
    }) 

次に、handleClick関数のターゲットIDにアクセスします。

private handleClick(event) { 
    const target = event.target; 
    const item = this.props.items[event.target.id] 
} 

頻繁に使用します。

+0

これは動作しません - イベントハンドラの 'event.target'の値は単にHTML文字列です。 'id'プロパティはありません。実際の例を見せてもらえますか? – duncanhall

関連する問題