【发布时间】:2021-03-07 09:23:11
【问题描述】:
我正在制作一个带有单选按钮的简单反应应用程序。
这里有一个可用的默认数据,例如,
const defaultData = [{ ContactMode: 3 }, { ContactMode: 2 }, { ContactMode: 2 }];
要求:
-> 需要迭代这个defaultData 并在每一行中指定它们各自的ContactMode 模式。
工作片段:
const { useState } = React;
const App = () => {
const [formValue, setFormValue] = useState({
ContactMode: 1
});
const defaultData = [{ ContactMode: 3 }, { ContactMode: 2 }, { ContactMode: 2 }];
const handleInputChange = (e, index) => {
const { name, value } = event.target;
setFormValue({
...formValue,
[name]: value
});
};
const submitData = () => {
console.log(formValue);
};
return (
<div>
<form>
{defaultData.map((item, index) => {
return (<React.Fragment>
<label> Contact Mode </label>
<input
type="radio"
name="ContactMode"
checked={item.ContactMode == 1}
value={1}
onChange={(event) => handleInputChange(index, event)}
/>{" "}
Email
<input
type="radio"
name="ContactMode"
checked={item.ContactMode == 2}
value={2}
onChange={(event) => handleInputChange(index, event)}
/>{" "}
Text
<input
type="radio"
name="ContactMode"
checked={item.ContactMode == 3}
value={3}
onChange={(event) => handleInputChange(index, event)}
/>{" "}
Both
<br />
<br />
<button type="button">
Save
</button>
<br />
<br />
<br />
</React.Fragment>);
})}
</form>
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.11.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>
预期输出:
Contact Mode Email Text Both (Checked)
Contact Mode Email Text(Checked) Both
Contact Mode Email Text(Checked) Both
注意:我无法修改名称属性name="ContactMode".. 原因是我每行也有单独的保存按钮,单击该保存按钮时,特定行将被保存..并且每一行都应该有name="ContactMode" ..
编辑:
由于我的问题不清楚我想要实现的目标,我将在此处提供整个代码。
->我有一个步进表单,其中第 2 步是就业部分,默认情况下我有要设置到表单中的值,
const dynamicData = [
{
EmploymentID: 1,
companyName: 'Company One',
designation: 'Designation One',
ContactMode: 3,
},
{
EmploymentID: 2,
companyName: 'Company two',
designation: 'Designation One',
ContactMode: 2,
},
];
-> 在useEffecthook 里面我设置了表单值,
React.useEffect(() => {
setExpanded(0);
setValue((prev) => {
const companyDetails = [...dynamicData];
return { ...prev, companyDetails };
});
}, []);
这里带有输入框的表单值被正确绑定,但是单选按钮的值没有被检查。
-> 有两个数据可用,但默认情况下第一个将展开,而第二个将在单击第一个下方的 Expand 按钮时打开。
->点击save按钮后,该特定对象(inputField)将与修改后的数据一起被控制台记录(仅用于测试)。
这里的 ISSUE 是,如果我们修改数据,那么一切正常,但单选单选属性并没有使项目被选中..(选中的指示不起作用)..
请转到下面给出的代码框中的第 2 步以查看问题。要查看第二项,请单击展开按钮..
请帮我在每一行设置默认单选按钮值。
【问题讨论】:
-
您将
handleInputChange定义为使用(e, index),但在UI 中您颠倒了handleInputChange(index, event)的顺序。你的defaultData也有两个{ ContactMode: 2 }而没有{ ContactMode: 1 },也许这是故意的。正如@vkvkvkv 指出的那样,在所有无线电输入中使用相同的name属性会将它们全部放在同一个无线电组中,并且只能有一个选定的无线电组值。 -
您是否可以控制输入的映射方式?你能分享更多关于每个按钮如何保存特定行的信息吗?行是如何识别的?保存的数据是什么?我有一个想法,但这取决于您对这些问题的回答才能真正了解您的要求/限制。
-
@DrewReese,我会尽快编辑问题,但在此之前我已经制作了一个代码框,其中包含我在这里为您提供的所有代码codesandbox.io/s/next-dynamic-testing-issue-forked-ebovz?file=/… .. 在此表格中,请转到第 2 步(就业详情) 查看我在哪里放置输入框和单选按钮..
-
@DrewReese,这是一种手风琴形式,因此将有
Expand和Shrink选项,这使得每个数据在点击时可展开Expand.. -
@DrewReese,请查看相关编辑以更好地理解您在上述评论中提到的问题。
标签: javascript html reactjs radio-button