【问题标题】:React: Let child class assign state?React:让子类分配状态?
【发布时间】:2016-03-18 19:30:58
【问题描述】:

设计说明


我有一个带有箭头函数的React 类,该函数从子类(模块)中调用。它简称为saveData,其目的是将特定于每个模块的输入值保存到state。好吧,我的默认状态有默认道具(static defaultProps):

state = {
  a : this.props.initialA,
  b : this.props.initialB,
  c : ...
}

并且说saveData 函数是一个胖箭头函数,它应该将输入值从子类推送到父类中的特定状态属性:

saveData = (val) => this.setState( {a : val} )

每个子类都获得通过 JSX 传递的 saveData 函数,并有自己的输入。单击按钮时,我将值作为参数调用该函数:

/* A child class */

pushData = (e) => {
  e.preventDefault()
  const val = this.refs.a.value
  this.props.saveData(val)
}

render() {
  return(
    <input id='a' ref='a' ... />
    <button onClick={this.pushData} ... />
  )
}



这一切都很好!现在为我担心

如您所见,在上面的示例中,状态属性a 是硬编码的。这不是我想要的。我想要另一个参数设置 state 属性,在我的脑海中可能很简单:

/* In parent class */

saveData = (prop, val) => this.setState( {prop : val} )


/* In child class */

pushData = (e) => {
  ...
  const val  = this.refs.a.value,
        prop = a;
  this.props.saveData(prop, val)
}

下面是我在使用这种方法时遇到的问题:

  • 我是否正确理解箭头函数不接受参数?因为我确实在pushData 中使用了(e),甚至在saveData 中使用(val) 之前都为我工作过。
  • 关键点: 不管怎么说,this.setState({prop:val}) 中的属性不会被分配。它只会添加一个名为prop 的新属性,即使prop 是一个内容完全不同的变量、参数或其余参数。


有没有办法让子类分配...setState({prop...

(或者我只是过于复杂了?我不是在想React?我有时觉得在 React 中思考就像在思考 $con"!"\˜*.ht"&amp;&amp;su20%+o?else{((())...())}of

【问题讨论】:

  • @FelixKling 我想相应地标记它,但我觉得这个问题绝对不是重复的。人们可能会在寻找 ReactJS 和 setState 函数时发现我的这个问题,因为他们甚至不知道自己做错了什么(就像我一样)。显然那里提到了解决方案,就像在这里一样。对不同问题的相同解决方案仍然是重复的吗?请澄清,我会相应地标记。

标签: javascript reactjs ecmascript-6 arrow-functions


【解决方案1】:

箭头函数只不过是语法糖

()=>{} is equivalent to function(){}.bind(this)

因此,它们的行为与任何其他函数完全相同,除了范围是词法绑定的。它确实需要参数。如果 saveData 未按您希望的方式工作,则您可能正在调用具有错误值的函数。

而且,当你这样做时

saveData = (prop, val) => this.setState( {prop:val} )

javascript 不会将 prop 评估为变量。这里的 'prop' 被解释为一个字符串。

相反,在 ES5 中试试这个

var temp = {};
temp[prop] = val;
saveData = (prop, val) => this.setState( temp )

或者这个,在 ES6 中,

saveData = (prop, val) => this.setState({[prop]:val})

[] 允许您评估包含在其中的变量。

【讨论】:

  • 您先生,在几分钟内缓解了我几个小时以来的头痛......非常感谢!你介意再解释一下为什么 JavaScript 不会解释 prop 而是 val 以及为什么我必须将 prop 参数括在方括号中吗?这不是我通常会做的事情,但这是解决这个问题的全部方法。
  • Javascript 应该是这样工作的吗?如果你想做{title:'Sometititle'},将'title'解释为一个变量没有意义,它应该是一个字符串。但是,在某些情况下您需要创建动态道具,这就是为什么我们的祖先在 Javascript 中使用 '[ ]' 祝福我们的原因。很高兴我能帮助玛丽安。
  • 让我有种昨天刚开始学JS的感觉哈哈哈...谢谢你的解释!
猜你喜欢
  • 2021-09-26
  • 2021-09-29
  • 2021-09-25
  • 2019-03-08
  • 1970-01-01
  • 2016-09-16
  • 2020-06-24
  • 2016-03-25
  • 2019-01-09
相关资源
最近更新 更多