2017-01-23 47 views
0

我有這樣的代碼 它的功能是搜索和過濾器的渲染,數據來自this.props.allList,但它不工作,我認爲錯誤是在狀態,但我不知道的setState不是一成不變的

// component.jsx 'use strict';

import React, {Component} from 'react'; 
import PureRenderMixin from 'react-addons-pure-render-mixin'; 
import Immutable from 'immutable';  


export default class ListComponent extends Component { 

constructor(props) { 
    super(props); 
    this.state = { 
     allList: Immutable.List(), 
     filteredData: Immutable.List(), 
    }; 
    this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this); 

    } 

    componentWillMount() { 
    this.setState({ 
     allList: Immutable.fromJS(this.props.allList).toList(), 
     filteredData: Immutable.fromJS(this.props.allList).toList() 
    }); 
    } 

    filterData(event) { 
    event.preventDefault(); 
    const regex = new RegExp(event.target.value, 'i'); 
    const filtered = this.state.allList.filter(function(datum) { 
     return (datum.get('name').search(regex) > -1); 
    }); 

    this.setState({ 
     filteredData: filtered, 
    }); 
    } 

    render() { 
    const { filteredData } = this.state; 
    const prettyRows = filteredData.map(function(datum) { 
     return (
     <tr> 
     <td>{ datum.get("status") }{datum.status}</td> 
     <td>{ datum.get("count") }{datum.count}</td> 
    </tr> 
    ); 

    }); 
    return(
     <div> 
     <input 
      type="text" 
      className="form-control" 
      onChange={ this.filterData.bind(this) } 
      placeholder="Search" /> 
     <table 
      <thead> 
      <tr> 
       <th>id </th> 
       <th>Name</th> 
      </tr> 
      </thead> 

      <tbody> 
      { prettyRows } 
      </tbody> 
     </table> 
    </div>); 
    } 
} 

的JSON

{ 
    "count": 3, 
    "status": "SUCCESS", 
    "tours": [ 
    { 
     "title": "item 1", 
    }, 
    { 
     "title": "item 2", 
    }, 
    { 
     "title": "item 3", 
    }, 

    ] 
} 

這裏codepen:http://codepen.io/fernandooj/pen/WROpeg 感謝您的幫助

+0

這是你的代碼的確切副本嗎?如果是這樣,你的渲染方法中有無法訪問的代碼。在你聲明'{filteredData} = this.state;'你有'return()'包裝map函數,以便代碼停止執行並返回該地圖。作爲什麼被渲染 – finalfreq

+0

對不起,我已經壞了渲染在這裏,並修改代碼,但仍然不會渲染 –

回答

2
  1. 我在你的代碼注意到的第一件事是,你正在使用React.render,

    React.render(<App />, document.getElementById('app'));

    這應該是ReactDOM .render React Docs

  2. 這裏是你的代碼沒有不可改變的工作版本codepen

  3. 這裏是一個codepen與永恆的工作。

筆記:
只有列表是不可變的結構,而不是其中的對象,這樣你就不必使用datam.get(「名稱」),datam.name作品。

  1. 「我需要的狀態,能夠做到crud,列表,修改,消除」我認爲你所說的是你想使用反應組件狀態所以過濾是在組件ui級別執行的,同時保持存儲中選項(數據)的原始完整列表?如果你的目標是保持店內的狀態最少的,您的數據流可能應該是這樣的:
    1. 行動在組件調度 - > 商店是在必要時更新 - >
    2. 減速返回的部分商店 與相關信息 - >
    3. 選擇器對數據執行計算,並返回 過濾/減少/計算的數據到視圖。 說明:Reselect是一個很好的工具。

這有助於你保持你的店作爲「單一來源」,並保持你的組件「幹」。

+0

嗨,謝謝你的幫助:我認爲這不是問題,我認爲這個問題,因爲我把在狀態 –

+0

JSON編輯我的迴應上面。 – kfitzi

+0

嗨,謝謝你的回答,它實際上是我正在尋找的,現在我有另外一個問題,當我將它傳遞給我的測試環境時,我從redux中獲取數據,並在商店中獲取它,但這樣做不爲我工作,如果我做console.log(this.props.list)加載我,但如果我做console.log(this.state.list)不加載我,你知道它爲什麼可以是 –

0

該問題可能是由變量prettyRows造成的。這個問題可能是由於沒有變量datum.get("status"), or datum.status

您能否提供更多信息,如控制檯中的錯誤?

+0

感謝您的幫助,我沒有錯誤,如果我把console.log(this.props.allList)帶給我的JSON好,但在渲染時不起作用 –

+0

問題:如果您在映射項目內調用'{datum.status}',您爲什麼需要使用'{datum.get(「status」)}'?如果我沒有記錯,data.status應該已經是值。 也許在數據下添加一個調試器或console.log來檢查試圖返回的值。 – Gary