Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在react中的子组件中设置值_Javascript_Reactjs - Fatal编程技术网

Javascript 在react中的子组件中设置值

Javascript 在react中的子组件中设置值,javascript,reactjs,Javascript,Reactjs,在下面的场景中,我有一个非常简单的子组件(箭头组件),它的作用类似于计数器。计数器可以增加一个简单的值。如果家长想将计数器设置为x怎么办?显而易见的答案是,只需将参数设置为x。但由于父组件中的变量是一个钩子,因此它将是只读的。然后您是否必须为子对象上的getter和setter变量添加一个参数?然后孩子会处理这两个变量?或者这里的最佳实践是什么?或者有没有办法把整个钩子转移给孩子?在我的世界里,你必须给孩子添加两个参数,这真的很不漂亮 const App = props => { co

在下面的场景中,我有一个非常简单的子组件(箭头组件),它的作用类似于计数器。计数器可以增加一个简单的值。如果家长想将计数器设置为x怎么办?显而易见的答案是,只需将参数设置为x。但由于父组件中的变量是一个钩子,因此它将是只读的。然后您是否必须为子对象上的getter和setter变量添加一个参数?然后孩子会处理这两个变量?或者这里的最佳实践是什么?或者有没有办法把整个钩子转移给孩子?在我的世界里,你必须给孩子添加两个参数,这真的很不漂亮

const App = props => {
  const resetChildCounter = () => {
    alert("what to do here");
  };

  return (
    <div className="App">
      <Child />
      <button onClick={resetChildCounter}>
        Reset child counter from parent
      </button>
      <button onClick={resetChildCounter}>Set child counter to 5</button>
    </div>
  );
};

const Child = props => {
  const [counter, setCounter] = useState(0);

  return (
    <div>
      <span>Counter is: {counter}</span>
      <button
        onClick={() => {
          setCounter(counter + 1);
        }}
      >
        Increment
      </button>
    </div>
  );
};
const-App=props=>{
常量resetChildCounter=()=>{
警惕(“在这里做什么”);
};
返回(
从父计数器重置子计数器
将子计数器设置为5
);
};
const Child=props=>{
const[counter,setCounter]=useState(0);
返回(
计数器为:{Counter}
{
设置计数器(计数器+1);
}}
>
增量
);
};
你说得对

如果需要从父级设置,则需要将其存储为父级而不是子级的状态。如果你需要在孩子身上使用它,你需要把它传给孩子。最后,如果您也需要从子级设置它,则不直接进行设置,而是通过父级传递的setter道具进行设置

在我的世界里,你必须给孩子添加两个参数,这真的很不漂亮

const App = props => {
  const resetChildCounter = () => {
    alert("what to do here");
  };

  return (
    <div className="App">
      <Child />
      <button onClick={resetChildCounter}>
        Reset child counter from parent
      </button>
      <button onClick={resetChildCounter}>Set child counter to 5</button>
    </div>
  );
};

const Child = props => {
  const [counter, setCounter] = useState(0);

  return (
    <div>
      <span>Counter is: {counter}</span>
      <button
        onClick={() => {
          setCounter(counter + 1);
        }}
      >
        Increment
      </button>
    </div>
  );
};

如果你在父母或孩子身上都有一个状态,然后如果你有可能从两个方面对它进行变异,那就更难看了。它将打破React的理念。

子组件的作用类似于“混合”组件,它的作用类似于一个

混合组件的简单实现如下所示:

const NOOP = () => {}

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

  useEffect(() => {
    setCounter(initial);
  }, [initial]);

  useEffect(() => {
    onChange(counter);
  }, [onChange, counter]);

  return (
    <div>
      <span>Counter is: {counter}</span>
      <button onClick={() => setCounter(p => p + 1)}>Increment</button>
    </div>
  );
};

export default Child;
constnoop=()=>{}
const Child=({initial=0,onChange=NOOP})=>{
常量[计数器,设置计数器]=使用状态(初始值);
useffect(()=>{
设置计数器(首字母);
},[首字母];
useffect(()=>{
onChange(计数器);
},[onChange,counter]);
返回(
计数器为:{Counter}
setCounter(p=>p+1)}>Increment
);
};
导出默认子对象;

在这种情况下,如OP所述:

我想做一个自我维护的子组件,它的内容比一个简单的按钮多得多


您得到了一个具有受控功能的独立组件。

您可以将增量按钮移动到父组件,这样就不需要将setter传递给子组件。这只是一个示例来说明我的问题。我想做一个自我维护的子组件,它的内容比一个简单的按钮多得多。另外,我会有多个计数器,每个计数器都有自己的状态,我认为这样更好。但它有问题吗?据我所知,您的组件侦听参数的更改(如果我错了,请纠正我)。因此,当父对象将该参数更改为5时,子对象的计数器现在将为5。然后,子对象开始将该值增加到8。现在,父对象希望将该值设置回5。但是,您的活动不会被解雇,因为您再次将marameter设置为5,而孩子不会被触发?是的,这很有魅力。我更喜欢这种方法。更加独立!谢谢你的意见。谢谢。我同意丹尼斯的回答,因为它更独立。