2017-02-01 65 views
0
const Feed = React.createClass({ 
getInitialState: function() { 
return { 
    data: {} 
} 
}, 

componentDidMount: function() { 
axios.all([ 
    getAllTeams(), getAllDrivers() 
]).then((results) => { 
    let teams = results[0].data; 
    let drivers = results[1].data; 
    let newDrivers = normaliseDrivers(drivers); 
    var data = normaliseData(teams, newDrivers); 
    this.setState({ 
     data: data 
    }) 
    }) 
}, 

sortAndRenderPanels() { 
let teamsArr = Object.values(this.state.data); 
teamsArr.sort(function(a,b) { 
    return (a.positions[0][2016] > b.positions[0][2016]) 
    ? 1 : ((b.positions[0][2016] > a.positions[0][2016]) 
    ? -1 : 0); 
}); 
return teamsArr.map ((data, i) => { 
    return (
     <MyPanel 
     key={i} 
     data={data} 
     /> 
) 
}) 
}, 

sortAlphabeticallyAndRender() { 
let teamsArr = Object.values(this.state.data); 
var sorted = teamsArr.sort(function(a, b){ 
    var textA = a.name.toUpperCase(); 
    var textB = b.name.toUpperCase(); 
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; 
}); 
return sorted.map((data, i) => { 
    return (
    <MyPanel 
     key={i} 
     data={data} 
    /> 
) 
}) 
}, 

handleAlphabetClick (e) { 
e.preventDefault(); 
this.sortAlphabeticallyAndRender(this.state); 
this.forceUpdate(function() { 
    return this.state.data; 
}); 
}, 

render: function() { 
const cards = this.sortAndRenderPanels(); 
return (
    <div id="feed"> 
    <Button id='sort-button' onClick={this.handleAlphabetClick} type="button" className="btn btn-warning" aria-label="Left Align"> 
     <span > Sort Alphabetically</span> 
    </Button> 
    {cards} 
    </div> 
) 
} 
}); 

On按钮单击我想重新渲染面板,以按字母顺序显示。我知道我的函数来正确命令它们的工作,并以正确的顺序将数据记录到控制台,但似乎无法强制更新来重新呈现状态。对状态变化的React重新渲染

+0

作为一个反应的最佳实践,永远不要做forceUpdate(直到你确定你为什么要进行强制更新)。用户setState()用于fire渲染方法 –

回答

0

而不是做强制更新,始终使变state变量,它会自动re-renderui,每当你是sortingarray,更新state值与排序array,并编写一个单独的方法来创建面板,您的面板将自动更新hout forceupdate,试试这个:

const Feed = React.createClass({ 
    getInitialState: function() { 
     return { 
      data: {}, 
     } 
    }, 

    componentDidMount: function() { 
     axios.all([ 
      getAllTeams(), getAllDrivers() 
     ]).then((results) => { 
      let teams = results[0].data; 
      let drivers = results[1].data; 
      let newDrivers = normaliseDrivers(drivers); 
      var data = normaliseData(teams, newDrivers); 
      var value = this.sortAndRenderPanels(data); 
      this.setState({ data: value}) 
     }) 
    }, 

    sortAndRenderPanels: function (data) { 
     let teamsArr = Object.values(data); 
     teamsArr.sort(function(a,b) { 
      return (a.positions[0][2016] > b.positions[0][2016]) 
      ? 1 : ((b.positions[0][2016] > a.positions[0][2016]) 
      ? -1 : 0); 
     }); 
     return teamsArr || []; 
    }, 

    sortAlphabeticallyAndRender: function (data) { 
     let teamsArr = Object.values(data); 
     teamsArr.sort(function(a, b){ 
      var textA = a.name.toUpperCase(); 
      var textB = b.name.toUpperCase(); 
      return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; 
     }); 
     return teamsArr; 
    }, 

    handleAlphabetClick: function (e) { 
     e.preventDefault(); 
     let data = this.sortAlphabeticallyAndRender(this.state.data); 
     this.setState({data:data}); 
    }, 

    createPanel: function(){ 
     return this.state.data.map((data, i) => { 
      return (
       <MyPanel 
        key={i} 
        data={data} 
       /> 
      ) 
     }) 
    } 

    render: function() { 
     return (
      <div id="feed"> 
       <Button id='sort-button' onClick={this.handleAlphabetClick} type="button" className="btn btn-warning" aria-label="Left Align"> 
        <span > Sort Alphabetically</span> 
       </Button> 
       {this.createPanel()} 
      </div> 
     ) 
    } 
}); 
+0

嗨Mayank,这段代码似乎没有回应。谢谢你的回答。 – ste

+0

什么是我得到的错误,因为我确信它应该工作的代码:) –

+0

'不能将undefined或null转换为对象我相信这是在'sortAlphabeticallyAndRender()'中,因为数据以'对象'的形式到达,我正在转换为'array' – ste

0

如果我没有错,forceUpdate()方法将调用render()方法。

在渲染,你打电话:

const cards = this.sortAndRenderPanels(); 

,并以{}卡

我认为你需要在this.state

移动卡在你componentDidMount打印出来( )回调补充一点:

componentDidMount: function() { 
    let obj = this; 
    axios.all([ 
     getAllTeams(), getAllDrivers() 
    ]).then((results) => { 
     let teams = results[0].data; 
     let drivers = results[1].data; 
     let newDrivers = normaliseDrivers(drivers); 
     var data = normaliseData(teams, newDrivers); 
     this.setState({ 
      data: data, 
      cards: obj.sortAndRenderPanels() 
     }) 
    }) 
} 

并在您单击处理程序补充一点:

handleAlphabetClick (e) { 
    e.preventDefault(); 
    this.setState({ 
     cards: this.sortAlphabeticallyAndRender(this.state) 
    }); 
} 

重新呈现通常应该发生。如果不补充一点:

componentDidUpdate: function() { 
    this.forceUpdate(); 
} 

最后你需要在渲染{}卡更改与{} this.state.cards

问候

+1

将Ui项存储在状态变量中,总是存储数据并仅对数据进行更改,然后使用更新的数据创建ui,这是非常糟糕的做法。 –

+0

我曾尝试使用此代码,有和没有'componentDidUpdate()',但它似乎不工作,谢谢你的帮助寿。 – ste

相关问题