繁体   English   中英

将 React Hook 传递给功能组件

[英]Passing React Hook to functional component

我正在寻找一个功能组件,它接收一个钩子及其 Set function 作为参数,并使用这些字段(以及其他一些字段)构造一个关联的输入。 遇到传递传播运算符的问题(如“Learning React, 2nd edition”中所述)。 以下相关片段,感谢帮助!

  1. 通用 function 接受一个初始值并返回一个新的钩子及其 setValue function:
    export const useInput = (initialValue) => {
      const [value, setValue] = useState(initialValue);
      return [
        { value, onChange: (e) => setValue(e.target.value) },
        () => setValue(initialValue),
      ];
    };
  1. 要使用的钩子:
    const [firstName, setFirstName] = useInput("");
  1. 功能组件(经过一些清理)
      const MyInputComp = (props) => {
        return (
          <div>
            <input
              className="blah-blah-blah"
              {props.obj}   // *ERROR*
              type="text"
              placeholder={props.placeholder}
              required={props.required}
            />
          </div>
        );
      };
  1. 下面是组件的调用方式:
    <MyInputComp
        text="First Name"
        obj={...firstName}  // *ERROR*
        placeholder="Jon"
        required={true}
    />

问题

您没有正确使用输入值和更新程序。

返回为{ value, onChange: (e) => setValue(e.target.value) }

但你作为obj单独通过

obj={...firstName}

const MyInputComp = (props) => {
  return (
    <div>
      <input
        className="blah-blah-blah"
        {props.obj}   // *ERROR*
        type="text"
        placeholder={props.placeholder}
        required={props.required}
      />
    </div>
  );
};

解决方案

valueonChange传播到底层input

const MyInputComp = (props) => {
  return (
    <div>
      <input
        className="blah-blah-blah"
        {...props.obj} // <-- spreads value & onChange props
        type="text"
        placeholder={props.placeholder}
        required={props.required}
      />
    </div>
  );
};

由于MyInputComp似乎只是代理了一些道具,因此您可以将它们全部传播,然后解构您需要的内容。

const MyInputComp = (props) => {
  return (
    <div>
      <input
        className="blah-blah-blah"
        {...props} // <-- spread all passed props
        type="text"
      />
    </div>
  );
};

利用

const [firstName, setFirstName] = useInput("");

<MyInputComp
    text="First Name"
    {...firstName} // <-- spread to input
    placeholder="Jon" // <-- spread to input
    required={true} // <-- spread to input
/>

您将需要进行一些更改。 首先传播props.obj object 以便引擎盖下的输入元素可以valueonChange道具。

 const MyInputComp = (props) => { return ( <div> <input className="blah-blah-blah" {...props.obj} type="text" placeholder={props.placeholder} required={props.required} /> </div> ); };

然后像这样渲染MyInputComp

 <MyInputComp
      text="First Name"
      obj={firstName}
      placeholder="Jon"
      required={true}
      onChange={handleNameChange}
/>

同样在自定义useInput挂钩中,更改 function 应该像

(value) => setValue(value)

而不是() => setValue(initialValue)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM