typescript 创建JSX元素数组-从父组件访问子组件状态

3pvhb19x  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(131)

我是React的新手,我正在尝试功能组件。这可能是一个多方面的问题,但它是这样的:
我有一个父组件和一个子组件,我用useState创建了一个数组,其中包含了每个子组件初始化时使用的值。
例如:

function ParentComponent() {

    const [optionInputArr, setOptionInputArr] = useState < IOptionInput[] > (initialOptions);
     

return (
<div>
   {
      optionInputArr.map((item) => {
        return <OptionInput optionInput = {
          item
        }
        key = {
          item.key
        }
        />
      })
    }

</div>
)

}

所有内容都呈现得很好,但现在我有一个用例,需要访问QuestionInput组件中输入字段的值。
子组件:

function OptionInput(props: {optionInput: IOptionInput}){

    return (
        <>        
        <input></input>
        </>
    );

}

export default OptionInput;

我想到了一个将整个组件保存在ParentComponent中的方法,如下所示:

const[optionInputArr2, setOptionInputArr2] = useState<typeof OptionInput[]>([]);

我现在尝试在ParentComponent中初始化这些组件的集合,如下所示:

const initializeElems = ()=>{

     let props = {optionInput: {
            name: "",
            key: "",
            className: "",
            type: "",
            placeholder: ""
        }}

     let option1 = OptionInput(props);
        option1.key = props.optionInput.key; 

    setOptionInputArr2(option1);  // <-- results in Error

}

错误:
"Element"类型的参数不能赋给"SetStateAction〈((props:{选项输入:I选项输入;=〉元素)[]〉'. ts(2345)
我肯定做错了什么,但我不确定是什么。
我还尝试这样创建组件:

let elem = React.createElement("OptionInput",props); 
setOptionInputArr2(elem); // <---- results in an Error

这似乎也不起作用。
类型为"React元素〈{选项输入:{名称:字符串;键:字符串;类名:字符串;类型:字符串;占位符:字符串;};},字符串|"JSXElementConstructor〉"不能赋给类型为"SetStateAction〈((属性:{选项输入:I选项输入;})=〉元素)
我不知道这是否只是我,但错误是相当混乱,我正在寻找的功能基本上是这样的:
1.具有可以访问每个子组件状态的父组件
1.子组件包含自己的状态
我想错了吗?
编辑1:我想我应该使用UseRef()钩子来做这件事,我还不确定,但我认为这样我可以访问子组件。

5jvtdoz2

5jvtdoz21#

为什么需要在State中存储组件?

最好存储组件状态,假设您想从一个父元素创建多个输入字段

const initialState= [
        {optionInput: {
            name: "",
            key: "",
            className: "",
            type: "",
            placeholder: "",
            value: '' //default value, this field has to be initialized
        }},
       {optionInput: {
            name: "",
            key: "",
            className: "",
            type: "",
            placeholder: "",
            value: '' //default value, this field has to be initialized
        }}] 

const [inputs, setInputs] = useState(initialState)
const updateInput = (index, data)=>{
     let newInputsState = [...inputs]
     newInputsState[index] = {...newInputsState[index], ...data}
     setInputs(newInputsState)
}

return <ChildComponent inputs={inputs} updateInput={updateInput}/>

子组件

const ChildComponent = ({inputs, updateInput})=> inputs.map((inputProps, index)=>
        <OptionInput 
               {...inputProps} 
               key={index} 
               onChange={(e)=>
                    updateInput(index,{value: e.target.value})
               }
         />)

现在,您可以从父级操作inputs状态

相关问题