【问题标题】:Passing state from react-select <Select> (in function form) to a parent Class将状态从 react-select <Select> (以函数形式)传递给父类
【发布时间】:2021-07-19 23:24:58
【问题描述】:

我正在尝试在我的应用程序中使用 react-select“选择”组件作为一种方便的方式来生成一系列下拉列表作为我的 UI 的一部分。

从 react-select 文档中,我已经能够让这些组件使用所需的选项进行渲染;但是,从 Select 组件中存储的值通过 useState 挂钩存储为状态变量。

我需要将这些菜单的值(状态)传递给父组件。我不知道如何让这些函数中生成的状态值能够在更高的父组件中读取。以下是我目前拥有的一些 sn-ps。

注意:为这些子函数填充选项道具的数组是在更高的父组件处生成的,并作为道具传递下来。部分代码似乎没有问题

function ButtonA(props){
  const options=props.buttonAOptions;
  const [selectedOption, setSelectedOption]=useState(null);
  
  return(
    
    <div>
      <p>Button A 
      <Select
      value={selectedOption}
      onChange={newValue =>setSelectedOption(newValue)}
      options={options}
      />
     
      </p>
    </div>
     
  )
}

function ButtonB(props){
  const options=props.buttonBOptions;
  const [selectedOption, setSelectedOption]=useState(null);
  
  return(
    
    <div>
      <p>Button B 
      <Select
      value={selectedOption}
      onChange={newValue =>setSelectedOption(newValue)}
      options={options}
      />
     
      </p>
    </div>
     
  )
}

 class Window extends React.Component {
         constructor(props){
           super(props);
           } 
// there are some other methods in here that are not related to this problem

      render(){
           return (
             
             <div>
             <ButtonA  
             buttonAOptions={this.props.buttonAOptions}
             
             />
             
               <ButtonB 
               buttonBOptions={this.props.buttonBOption}
               />
             
             </div>
               
               )
      }
  }

【问题讨论】:

  • 我从这里开始。在这种情况下,这似乎不是一个选项,因为 react-select 组件需要 setState。我知道 Redux 有一个映射状态到道具功能,但我不知道在这个例子中提升状态有什么帮助

标签: reactjs react-select


【解决方案1】:

您可以通过回调与父组件通信。您可以解除状态并传递回调以更改父级的状态,这也作为道具传递给您的组件,或者您可以在父级和子级上保持相同的状态,只需将子级的更改传达给父级。

例子:

function Parent() {
  const [counters, setCounters] = useState({ a: 0, b: 0 });

  return (
    <>
      A: {counters.a}
      <Child onChange={(value) => setCounters((s) => ({ ...s, a: value }))} />

      B: {counters.b}
      <Child onChange={(value) => setCounters((s) => ({ ...s, b: value }))} />
    </>
  )
}

function Child({ onChange }) {
  const [counter, setCounter] = useState(0);

  function handleClick() {
    setCounter((s) => {
      const newValue = s + 1;

      onChange && onChange(newValue);

      return newValue;
    })
  }

  return <button onClick={handleClick}>Add 1</button>;
}

【讨论】:

  • 感谢您的反馈!我无法正式投票赞成答案,但如果可能的话。这种方法是否有任何复杂性是 Parent 是一个类而不是一个函数?
  • 没有我能立即想到的复杂情况,也许要确保回调方法在每次运行时都不会改变,这样你就没有不必要的重新渲染。它与类的工作方式相同。您只需在您的孩子身上创建一个接口,承诺每天回调 js。
猜你喜欢
  • 2019-03-08
  • 2023-03-08
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2016-12-11
  • 2022-07-15
  • 2013-03-08
  • 1970-01-01
相关资源
最近更新 更多