我有一个反应组件,它表示单词表中的一行。它在状态更改时重新呈现,但不会更新事件处理程序onClick
。我已经将组件剥离到最低限度,并且仍然存在问题。当我点击“编辑”链接时,控制台打印出“onEdit”,并且状态在浏览器中似乎看起来正确,但是当我点击“还原”时,控制台再次打印“onEdit”。为什么在状态更改之后onClick
事件没有更新为使用_onRevert
函数?为什么它仍然挂在第一个渲染通道的旧事件处理程序上?谢谢。React组件无法更新onClick事件处理程序
var React = require('React/addons');
var WordListItem = React.createClass({
getInitialState: function(){
return {
isEditing: false,
english: this.props.word.english
};
},
_onEdit: function(e) {
e.preventDefault();
console.log('onEdit');
this.setState({isEditing: true});
},
_onRevert: function(e){
e.preventDefault();
console.log('onRevert');
this.setState({isEditing: false});
},
render: function() {
if(this.state.isEditing) {
return (
<div>
<span>Editing: {this.state.english} </span>
<a href="#" onClick={this._onRevert}>Revert</a>
</div>
)
} else {
return (
<div>
<span>Not Editing: {this.state.english} </span>
<a href="#" onClick={this._onEdit}>Edit</a>
</div>
)
}
}
})
module.exports = WordListItem;
更新下
因此,原来,它的作品,如果我这个组件粘贴到我的主要app.jsx文件,它的工作原理,但如果我有使用它需要的js。这很奇怪,因为browserify正在工作,因为我仍然可以包含其他文件并编写嵌套的反应组件,只是它的事件不会在某些元素上得到更新。也许在这一点上,我应该提出一个新的问题,这个问题更关注。
var React = require('react/addons');
//var materialize = require('materialize-css');
var word = {id: 4671810846, english: "water", persian: "آب", phonetic: "aab", tags: ["noun","food","drink"]};
var WordListItem = require('./components/wordList/WordListItem.jsx');
// var WordListItem = React.createClass({
// getInitialState: function(){
// return {
// isEditing: false,
// english: this.props.word.english
// };
// },
// _onEdit: function(e) {
// e.preventDefault();
// console.log('onEdit');
// this.setState({isEditing: true});
// },
// _onRevert: function(e){
// e.preventDefault();
// console.log('onRevert');
// this.setState({isEditing: false});
// },
// render: function() {
// if(this.state.isEditing) {
// return (
// <div>
// <span>Editing: {this.state.english} </span>
// <a href="#" onClick={this._onRevert}>Revert</a>
// </div>
// )
// } else {
//
// return (
// <div>
// <span>Not Editing: {this.state.english} </span>
// <a href="#" onClick={this._onEdit}>Edit</a>
// </div>
// )
// }
//
// }
// })
React.render(<WordListItem word={word}/>, document.getElementById('app'));
console.log“this”里面的函数调用了_onEdit,然后console.log的状态是isEditing。你确定你的上下文在该函数中是正确的吗? –
那很有趣。当我登录'this'并单击编辑然后单击还原时,_onEdit和_onRevert处理程序都会记录相同的this对象,并且isEditing的状态在此对象内设置为true。但是,this.state.isEditing首先打印false,然后打印为true。 – aherriot
好吧,至少有真正的问题。你的代码工作,但它看起来像inital国家正在重新设置。 –