如何将数组值传递给 Formik select
how to pass array values to Formik select
我将 Formik 用于应用程序中的一堆管理控制台表单。到目前为止我还没有这个用例。
我的 Formik 表单使用 2 个自定义组件之一,Myinputtext(输入框)或 MySelect(下拉)。到目前为止,我不需要任何其他组件。这是我的 Myselect 组件的样子。
const MySelect = ({ label, ...props }) => {
const [field, meta] = useField(props);
return (
<div>
<label htmlFor={props.id || props.name}>{label}</label>
<select className={props.className} {...field} {...props} />
{meta.touched && meta.error ? (
<div className="error">{meta.error}</div>
) : null}
</div>
);
};
在表单中,我像这样将值传递给此组件
<MySelect className="select-input" label="Losing Player" name="losingPlayer">
<option value="">Select Losing Player</option>
<option value="player1">{state.Player1Name} </option>
<option value="player2">{state.Player2Name} </option>
所有这些都适用于我目前构建的一些表单。现在在第四种形式中,从后端返回的数据以数组的形式出现,我试图将数组作为输入传递给 myselect 组件
<MySelect className="select-input" label="Losing Player" name="losingPlayer">
<option value="">Select Losing Player</option>
<option value="player1">{name of array object} </option>
这是失败的,没有提供正确的结果。
在 formik 官方文档中说有一种方法可以像这样处理数组对象
<Form>
<Field name="friends[0]" />
<Field name="friends[1]" />
<button type="submit">Submit</button>
</Form>
</Formik>
但是我的数组大小可以是动态的,我不能像上面那样硬编码,0,1。
我试过像这样在 select 组件内渲染数组,
<MySelect className="select-input" label="Winning Player" name="winningPlayer">
{props.initialValues.map((player) => {
<option key={player} value={player}> {player} </option> })} </MySelect>
这不会引发任何错误。但下拉列表显示为空。
我基本上希望将数组中的名称显示为下拉列表。解决这个问题的正确解决方案是什么?
终于成功了:-
return (
<div>
<label htmlFor={props.id || props.name}>{label}</label>
{!props.player ? <select className={props.className} {...field} {...props} />
:
<select className={props.className}>
{props.player.map((player) => {
return (
<option key={player} value={player}>
{player}
</option>
)
})}
</select>
}
{meta.touched && meta.error ? (
<div className="error">{meta.error}</div>
) : null}
</div>
您需要像这样在 select 中映射数组和渲染选项:
{options?.map(({ value }) => (
<option key={value} value={value}>
{value}
</option>
))}
我将 Formik 用于应用程序中的一堆管理控制台表单。到目前为止我还没有这个用例。
我的 Formik 表单使用 2 个自定义组件之一,Myinputtext(输入框)或 MySelect(下拉)。到目前为止,我不需要任何其他组件。这是我的 Myselect 组件的样子。
const MySelect = ({ label, ...props }) => {
const [field, meta] = useField(props);
return (
<div>
<label htmlFor={props.id || props.name}>{label}</label>
<select className={props.className} {...field} {...props} />
{meta.touched && meta.error ? (
<div className="error">{meta.error}</div>
) : null}
</div>
);
};
在表单中,我像这样将值传递给此组件
<MySelect className="select-input" label="Losing Player" name="losingPlayer">
<option value="">Select Losing Player</option>
<option value="player1">{state.Player1Name} </option>
<option value="player2">{state.Player2Name} </option>
所有这些都适用于我目前构建的一些表单。现在在第四种形式中,从后端返回的数据以数组的形式出现,我试图将数组作为输入传递给 myselect 组件
<MySelect className="select-input" label="Losing Player" name="losingPlayer">
<option value="">Select Losing Player</option>
<option value="player1">{name of array object} </option>
这是失败的,没有提供正确的结果。
在 formik 官方文档中说有一种方法可以像这样处理数组对象
<Form>
<Field name="friends[0]" />
<Field name="friends[1]" />
<button type="submit">Submit</button>
</Form>
</Formik>
但是我的数组大小可以是动态的,我不能像上面那样硬编码,0,1。
我试过像这样在 select 组件内渲染数组,
<MySelect className="select-input" label="Winning Player" name="winningPlayer">
{props.initialValues.map((player) => {
<option key={player} value={player}> {player} </option> })} </MySelect>
这不会引发任何错误。但下拉列表显示为空。
我基本上希望将数组中的名称显示为下拉列表。解决这个问题的正确解决方案是什么?
终于成功了:-
return (
<div>
<label htmlFor={props.id || props.name}>{label}</label>
{!props.player ? <select className={props.className} {...field} {...props} />
:
<select className={props.className}>
{props.player.map((player) => {
return (
<option key={player} value={player}>
{player}
</option>
)
})}
</select>
}
{meta.touched && meta.error ? (
<div className="error">{meta.error}</div>
) : null}
</div>
您需要像这样在 select 中映射数组和渲染选项:
{options?.map(({ value }) => (
<option key={value} value={value}>
{value}
</option>
))}