React 在两个组件之间传递多状态

Posted

技术标签:

【中文标题】React 在两个组件之间传递多状态【英文标题】:React pass multi state between two components 【发布时间】:2019-07-24 21:32:01 【问题描述】:

我发现了一个关于如何在两个组件之间传递状态的gist。

这里是jsbin

但是多态呢?

我想要两个输入字段,并在我编辑时在其他组件中显示输入的文本。

我试过这样编辑

this.state = 
  fieldVal: "" //first input state
  otherFieldVal: "" //second

  //input onChange
  onUpdate = name => (event) => 
    this.setState( [name]: event.target.value );
  ;

没有运气。

如何让它在多输入字段的多状态下工作?

【问题讨论】:

您是否正在寻找类似jsbin.com/locoqisaqo/edit?js,output 的解决方案? 很酷,但是如果我有很多输入和状态并且我不想重复自己通过passedVal1=this.state.fieldVal1、passedVal2=this.state.fieldVal2 和3和 4,在这种情况下我可以使用 this.setState( [name]: event.target.value ) 吗?我不知道该怎么做。 你能检查一下我的答案吗?并查看此演示 stackblitz.com/edit/react-fsrkp2 ? 【参考方案1】:

不需要在 Child 和 parent 中都保留状态。您可以像下面这样编写您的子组件,您可以使用 data-attirb 动态访问两个状态,或者您可以按照@Isaac 的回答。将状态保留在 Child 并将状态传递给 Parent 或 keep事件从 Child 到 Parent。

 export class Child extends React.Component 

  update = (e) => 
    this.props.onUpdate(e.target)
  ;

  render() 
    return (
      <div>
        <h4>Child</h4>
        <input
          type="text"
          placeholder="type here"
          onChange=this.update
         data-state = "fieldVal"
          value=this.props.fieldVal
        /><br/><br/>
      <input
          type="text"
          placeholder="type here"
          onChange=this.update
      data-state = "otherFieldVal"
          value=this.props.otherFieldVal
        />
      </div>
    )
  


export class OtherChild extends React.Component 
  render() 
    return (
      <div>
        <h4>OtherChild</h4>
        Value in OtherChild Props passedVal1: this.props.passedVal1 <br/>
      Value in OtherChild Props passedVal2: this.props.passedVal2
      </div>
    )
  

在父母中:

class App extends Component 

  onUpdate = (data) => 
    this.setState(
      [data.dataset.state]: data.value
    )
  ;

  render() 
    return (
      <div>
        <h2>Parent</h2>
        Value in Parent Component State fieldVal: this.state.fieldVal <br/>
        Value in Parent Component State otherFieldVal: this.state.otherFieldVal
        <br/>
        <Child onUpdate=this.onUpdate fieldVal= this.state.fieldVal otherFieldVal =this.state.otherFieldVal/>
        <br />
        <OtherChild passedVal1=this.state.fieldVal passedVal2=this.state.otherFieldVal/>
      </div>
    );
  

demo

【讨论】:

很好,我改为使用 'state=this.state' 传递状态并使用 'this.props.state.fieldVal' 显示状态,所以我现在不必重复自己如果我有 100 个输入和状态 :) 有没有另一种好方法来做同样的结果? 是的,还有其他选择,现在也会建议 :) 检查这个stackblitz.com/edit/react-ydyazj,你可以在一个数组中存储N个输入值,这个例子证明了这一点。【参考方案2】:

renderInput = (prop) => 
  return (
    <Input 
      onChange=(event) => 
        this.setState( [prop]: event.target.value );
      
    />
  )


render() 
  <div>
    this.renderInput('name')
    this.renderInput('age')
  </div>

我们可以设置一个renderInput 方法并使用参数渲染不同的输入来实现你的目标

【讨论】:

以上是关于React 在两个组件之间传递多状态的主要内容,如果未能解决你的问题,请参考以下文章

React 组件基本使用 ---父子组件之间的通信

如何在组件之间传递状态属性

在React Form无状态组件和状态完全Root组件之间传递多个输入字段

尝试在功能组件之间传递状态但出现“未定义”错误

React: React的组件状态机制

在 React 中将状态数据从一个组件传递到另一个组件