2016-07-27 12 views
0

に動作しますが、私のjsFiddle例です:あなたはページネーションの項目をクリックすると、あなたはそれが正しく動作していないことをhttps://jsfiddle.net/0se06am5/ページネーションは、2回目のクリックの後にここで

class Pagination extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { current: 1 }; 
     this.items = ['a', 'b', 'c']; 
     this.filteredItems = []; 

     this.prev = this.prev.bind(this); 
     this.next = this.next.bind(this); 
     this.set = this.set.bind(this); 
     this.filter = this.filter.bind(this); 
    } 

    componentWillUpdate() { 
     this.filter(); 
    } 

    prev() { 
     this.setState({ current: this.state.current - 1}); 
    } 

    next() { 
     this.setState({ current: this.state.current + 1}); 
    } 

    set(val) { 
     this.setState({ current: val }); 
    } 

    filter() { 
     this.filteredItems = this.items.filter((i, idx) => { 
      return (idx + 1) === this.state.current; 
     }) 
    } 

    render() { 
     return (
      <div> 
       {this.filteredItems.map((i, idx) => { 
        return <span key={`item_${idx}`}>{i}</span>; 
       })}<br /> 

       <span onClick={this.prev}>prev</span> 

       <span onClick={this.set.bind(this, 1)}>1</span> 
       <span onClick={this.set.bind(this, 2)}>2</span> 
       <span onClick={this.set.bind(this, 3)}>3</span> 

       <span onClick={this.next}>next</span> 

       <br /><span>current: {this.state.current}</span> 
      </div> 
     ) 
    } 
} 

実現しました。

なぜfilter()メソッドが遅く実行されるのですか? componentWillUpdate()の代わりに私はこのメソッドを移動する必要がありますか、何を書くべきですか?

+0

正確には動作しません。 –

+0

フィルタリングされた項目を正しく表示するには、ページ番号を2回クリックする必要があります。 – mwl

答えて

2

componentWillUpdateは、ではありません。は、最初のレンダリングで実行されます。 (demo)それは状態自体を変更しないようにレンダリングするためにフィルタリングを移動して、コンポーネントがレンダリングされるたびに、それが実行する必要があります:

render() 
{ 
    const items = this.items.filter((i, idx) => { 
     return (idx + 1) === this.state.current; 
    }).map((i, idx) => { 
     return <span key={`item_${idx}`}>{i}</span>; 
    }); 
    return (
     <div> 

      {items} 

      <br /> 

      <span onClick={this.prev}>prev</span> 

      <span onClick={this.set.bind(this, 1)}>1</span> 
      <span onClick={this.set.bind(this, 2)}>2</span> 
      <span onClick={this.set.bind(this, 3)}>3</span> 

      <span onClick={this.next}>next</span> 

      <br /><span>current: {this.state.current}</span> 
     </div> 
    ) 
} 

あなたはまた、1つの.reduceコールに.filter.map通話を組み合わせることができます(demo):

const items = this.items.reduce((arr, i, idx) => { 
    if((idx + 1) === this.state.current) { 
     arr.push(
      <span key={`item_${idx}`}>{i}</span> 
     ); 
    } 

    return arr; 
}, []); 
+0

すばらしい、ありがとう!また、 'reduce()'のヒントに感謝します:) – mwl

+0

あなたは大歓迎です:) –

関連する問題