2017-05-01 15 views
1

私はEmailItemというステートレスコンポーネントを持っています:それをクリックすると、私はそれをいくつかの機能を介して新しい小道具にすることができます。そのコンポーネントの小道具を制御するステートレスコンポーネントのonClickイベント

<EmailItem key={i} onClick={// onClick function} emailData={email} read={false} /> 

EmailItemがクリックされていると、読み取りpropがtrueに変更されます。

これは、ステートフルなコンポーネントをEmailItemとすることで実現できます。しかし、それは反復可能なコンポーネントであり、あなたが必要としない状態を追加する私の理解から、それは悪いです。間違っていれば私を正す。

e.targetとrefが動作しないため、私が使用する関数の内容について混乱します。

このread propは、ステートレスコンポーネントのアイテムのクラスを変更します。

const EmailItem = (props) => { 
    let readClass = props.emailData.read ? '--read' : '' 
    return (
    <div onClick={props.onClick} className='email'> 
     <div className={'email__read' + readClass} /> 
     <div className='email__leftside'> 
     <div className='email__from'>{props.emailData.from}</div> 
     <div className='email__subject'>{props.emailData.subject}</div> 
     <div className={'email__body'}>{props.emailData.body}</div> 
     </div> 
     <div className='email__rightside'> 
     <div className='email__date'>{props.emailData.date}</div> 
     <div className='email__time'>{props.emailData.time}</div> 
     </div> 
    </div> 
) 
} 

email__readクラス名は、電子メールが読まれたかどうかの指標かがない

+2

を試してみてonclickの –

+0

@PriyeshKumar私にそれを呼び出しますReduxを使用していますが、私はこの能力を認識しています。しかし、私はあなたがステートレスコンポーネントを参照するためにrefを使うことはできないことを知っています。そしてevent.targetはpropsを表示せず、html属性のみを表示します。私は、私が使用する機能の内容についてより混乱しています。元の投稿ではっきりしていないのは残念です。あなたはコンポーネントコード、およびコンテキストを置くことができる場合は、e.targetまたはREF必要なぜ – Sequential

+0

は、それは(あなたがしようとしているもの)^ _^ –

答えて

1

私が理解したところでは、親コンポーネントから子コンポーネントに関数(onClick)を渡して、その関数にemaildataをバインドできます。 ES6の矢印関数の構文はパラメータの束縛を処理し、親でクリックされたemailDataを取得できます。

あなたがこのコンポーネントにReduxのまたは同様、ディスパッチアクション、(親から)他のパス機能を使用している場合(無しCSS申し訳ありません)次の例

class Inbox extends React.Component { 

    constructor(props) { 
    super(props) 

    this.state = { 
     emails: [ 
     { read: false, from: "aaa", to: "aaato", subject: "aaasubject", body: "aaabody", date: "aaadate", time: "aaatime" }, 
     { read: true, from: "bbb", to: "bbbto", subject: "bbbsubject", body: "bbbbody", date: "bbbdate", time: "bbbtime" }, 
     { read: false, from: "aaa", to: "cccto", subject: "cccsubject", body: "cccbody", date: "cccdate", time: "ccctime" }, 
     { read: false, from: "ddd", to: "dddto", subject: "dddsubject", body: "dddbody", date: "ddddate", time: "dddtime" }, 
     ] 

    } 
    } 

    handleClick(index, ele) { 
    // ele is emaildata, do anything you want 
    var newEmails = this.state.emails 

    newEmails[index].read = true 
    this.setState({ 
     emails: newEmails 
    }) 
    } 

    render() { 
    return (
     <div> 
     <p>Emails</p> 
     { 
      this.state.emails.map((e, i) => { 
      return <EmailItem emailData={e} key={i} onClick={() => { this.handleClick(i, e) }} /> 
      }) 
     } 
     </div> 
    ) 
    } 
} 


const EmailItem = (props) => { 
    let readClass = props.emailData.read ? '--read' : '--unread' 
    return (
    <div onClick={props.onClick} className='email'> 
     <div className={'email__read' + readClass} /> 
     <div className='email__leftside'> 
     <p>{readClass}</p> 
     <div className='email__from'>From {props.emailData.from}</div> 
     <div className='email__subject'>To {props.emailData.subject}</div> 
     <div className={'email__body'}>Body {props.emailData.body}</div> 
     </div> 
     <div className='email__rightside'> 
     <div className='email__date'>Date {props.emailData.date}</div> 
     <div className='email__time'>Time {props.emailData.time}</div> 
     </div> 

     <p>---------------------</p> 
    </div> 
) 
} 
+0

これは私が完全に動作することがわかります。何らかの理由で私はすべての電子メールの記録を州に保存することに悩まされています。これらのレコードが10,000に達すると、大きなメモリのように思えます。しかし、これは正常だと思います。ありがとう! – Sequential

+0

うーん、あなたは一度にすべてのリストを表示するつもりはないと思います。そうでなければページネーションを使って電子メールを表示する必要があります。そして、彼らだけを州に保つ –

0

このリンクはあなたを助けることができるかもしれませ私が与えた張り出すその答え

How to pass function as props in React?

+0

はい、私は、コンポーネントに小道具として関数を渡す方法を知っています。私は、私が渡す必要がある機能の内容について、より混乱しています。 – Sequential

1

である何あなたの小道具を変更するには、状態を変更する必要があります。州がこのコンポーネントに住んでいないことは重要ではありません。コールバックを親コンポーネントから渡すことができ、ステートレスコンポーネント内でこのコールバックを呼び出して、親コンポーネントの状態を変更することができます。 注:状態は親に存在しません。それはより高い可能性があります。 これはあなたを助けるはずです:https://facebook.github.io/react/docs/lifting-state-up.html

私はこれがあなたに役立つことを願っています。

+0

あなたは、上位のコンポーネントでステータスを読み取ったすべての電子メールアイテムの状態を保存する必要があると言っていますか?何らかの理由で、私は大きな部分が集中しているコンポーネントに状態を作るように感じます。どのくらいの国家があまりにも多いのか分かりません。 – Sequential

+1

はい、複数の州全体ではなく、「真実の1つのソース」の大きな州のオブジェクトを目指すべきです。あなたが1か所に州を持っているときに、推論するほうがはるかに優れています。それは単なるオブジェクトなので、速くて安く、反応はあなたのために残ります(DOMの更新など)。私はあなたが良いと思う。 –

関連する問題