试图使用es6在没有多个处理程序的情况下创建动态状态,但我陷入了困境。我不知道下面的代码有什么问题
<div className="row-wrap"> <span>Mon</span> <input name="1_min" onChange={this.handleAdvancePrice} type="text" /> <input name="1_max" onChange={this.handleAdvancePrice} type="text" /> </div> <div className="row-wrap"> <span>Tue</span> <input name="2_min" onChange={this.handleAdvancePrice} type="text" /> <input name="2_max" onChange={this.handleAdvancePrice} type="text" /> </div> <button onClick={this.showStates}></button> .. .. handleAdvancePrice = (e) => { let dow = e.target.name.split('_')[0], type = e.target.name.split('_')[1], value = +(e.target.value); console.log(dow, type) // it print correctly this.setState = ({ [`advancePrice_${dow}_${type}`]: value }) } showStates = () => { console.log(this.state) //error this.setState is not a function, caused by handleAdvancePrice }
我检查了我的其他函数,handleAdvancePrice是罪魁祸首,但是出了什么问题?
罪魁祸首是=后面的多余迹象this.setState。另外,也不需要使用type and dow单独的; y,因为您可以直接使用e.target.name
=
this.setState
type and dow
e.target.name
class App extends React.Component { constructor() { super(); this.state = {} } handleAdvancePrice = (e) => { let dow = e.target.name; let value = e.target.value; this.setState ({ [`advancePrice_${dow}`]: value }) } showStates = () => { console.log(this.state) //error this.setState is not a function, caused by handleAdvancePrice } render() { return ( <div> <div className="row-wrap"> <span>Mon</span> <input name="1_min" onChange={this.handleAdvancePrice} type="text" /> <input name="1_max" onChange={this.handleAdvancePrice} type="text" /> </div> <div className="row-wrap"> <span>Tue</span> <input name="2_min" onChange={this.handleAdvancePrice} type="text" /> <input name="2_max" onChange={this.handleAdvancePrice} type="text" /> </div> <button onClick={this.showStates}>Show</button> </div> ) } } ReactDOM.render(<App/>, document.getElementById('app')); <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="app"></div>