2017-08-10 3 views
1

反応のビューが更新されるのは何ですか?コードは常にライブで表示されますか?Componentを拡張するクラスでrender()が呼び出されるのはいつですか?

私は管理者としてユーザーを追加し、削除しremoveAdminとmakeAdminと呼ばれる機能があり、ユーザーが管理者であるときにメンバー構成要素のレンダリングは、シールドのロゴをレンダリングして管理。それはうまく動作しますが、関数を使用してUIを変更するたびにレンダリングがトリガされているのか、レンダリングがコンポーネントの変更をリッスンしているのか不思議です。

class MemberList extends Component { 

constructor(props) { 
    super(props) 
    this.state = { 
     members: [], 
     loading: false, 
     administrators: [] 
    } 
    this.makeAdmin = this.makeAdmin.bind(this) 
    this.removeAdmin = this.removeAdmin.bind(this) 
} 

componentDidMount(){ 
    this.setState({loading:true}) 
    fetch('https://api.randomuser.me/?nat=US&results=12') 
    .then(response => response.json()) 
     .then(json => json.results) 
     .then(members => this.setState({ 
      members, 
      loading:false 
     })) 
} 

makeAdmin(email){ 
    const administrators = [ 
     ...this.state.administrators, 
     email 
    ] 
    this.setState({administrators}) 
} 

removeAdmin(email){ 
    const administrators = this.state.administrators.filter(
      adminEmail => adminEmail !== email 
     ) 
     this.setState({administrators}) 

} 


render() { 
    const { members, loading } = this.state 
    return (
     <div className="member-list"> 
      <h1>Society Members</h1> 

      { 
       (loading) ? 
        <span> loading...</span>: 
        <span>{members.length} members</span> 
      } 

       { (members.length)? 
       members.map(
       (member, i) => 
        <Member key={i} 
          // This admin prop is worked out by enumerating through the administrator 
          // array with some(). some() passes in the enumerators, checking whether 
          // the current member in members.map() exists in the administrators array 
          // and returns admin=true if so. 
          admin={this.state.administrators.some(
           adminEmail => adminEmail === member.email 
           )} 
          name={member.name.first + '' + member.name.last} 
          email={member.email} 
          thumbnail={member.picture.thumbnail} 
          makeAdmin={this.makeAdmin} 
          removeAdmin={this.removeAdmin}/> 
       ): 
       <span>Currently 0 members</span> 
      } 


     </div> 
    ) 

とメンバーコンポーネント:新しいプロパティを受信したときに、新しいコンポーネントにレンダリングトリガーときの状態の変化やで何

class Member extends Component { 

componentWillMount(){ 
this.style={ 
    backgroundColor: 'grey' 
} 
} 
render() { 

const { name, thumbnail, email, admin, makeAdmin, removeAdmin } = this.props 
return (

    <div className="member" style={this.style}> 
    <h1>{ name } {(admin) ? <FaShield/> : null}</h1> 
    <div> 
     <img src={ thumbnail }/> 
    </div> 
    <div> 
    { 
     (admin)? 
       <Button title="Make Admin" onClick={() => removeAdmin(email) } color="#841584"> Remove Admin </Button> 
: 
    <Button title="Make Admin" onClick={() => makeAdmin(email) } color="#841584"> Make Admin </Button> 

    } 
    <a href={`mailto:${ email }`}><p> {email} </p></a> 
    </div> 

    </div> 


) 
} 
} 

export default Member 
+0

、あなたはそれをグーグルで5分間で答えを見つけることができました。 – DrunkDevKek

答えて

2

各コンポーネントのレンダリングを駆動する主なオブジェクトは、this.propsthis.stateです。これらのオブジェクトのいずれかが更新されると、renderメソッドが実行されます。あなたが子供に新しいプロパティを送るたび

this.propsオブジェクトが更新されます。 this.statethis.setStateメソッドを使用して更新されます。

<Parent> 
    <Child {...this.props} /> 
</Parent> 
:経験則として、私はいつも、たとえば、子どもたちに小道具を渡すために、拡散演算子を使用していないお勧めします言われて、それは、あなたが子供たちに送っプロパティを追跡することが本当に重要だと

私はそのパターンを避けるでしょう。なぜなら、小道具のいずれかが変更された場合、すべての小道具が子供に送られるからです。代わりに私は子供たちが必要とするものだけを送ることをお勧めします。あなたはそれ以外の場合は、再レンダリングのすべてにとても簡単です、あなたはあなたのコンポーネントをレンダリングする必要がある場合非常に注意する必要があり

<Parent> 
    <Child some={this.props.value} /> 
</Parent> 

!これはパフォーマンスの問題につながります。

+0

あなたの星、ありがとう@クリスフェル、ちょうど私が知る必要があったもの –

0

それはあなたがすべきコンポーネントrenderメソッドを定義するかに依存します。 これは、あなたがそれを与えるstateまたはpropsに基づいて変更することができます。

頻度は少なくなりますが、パフォーマンスを向上させる必要がある場合は、メソッドを上書きして "スマート"にすることができるため、check outshouldComponentUpdateとすることができます。本当に基本的な質問に反応される何がちょうど求めてきました( `私はどうかレンダリング思ったんだけど、私は関数を使ってUIを変更したり、レンダリングする場合は、それぞれの時間をトリガされ、それの変化へのライブリスニングがコンポーネントだのですか?`)

関連する問題