【发布时间】:2017-12-29 12:02:48
【问题描述】:
我正在使用导入数据数组的组件模板生成表单字段元素。我希望能够隐藏其中一些元素,并在满足其他元素的条件时显示它们;这在表单字段中相当常见,例如当你选择A项时,表单域X出现,当你选择B项时,表单域X被隐藏。
我在 React 文档网站上的 conditional rendering 上阅读了相当多的内容,但这些示例并不能真正适用于我正在做的事情,尽管“防止组件渲染”部分已关闭。
我made a Codepen 演示了我的设置,如果满足第一个字段的条件(在此示例中,第一个字段应输入 5 个字符),我想做的是显示第二个字段。我已经通过一个道具来设置初始隐藏,但是我怎样才能找到那个特定的隐藏元素并取消隐藏呢?
// Field data
const fieldData = [{
"type": "text",
"label": "First",
"name": "first",
"placeholder": "Enter first name",
"hidden": false
}, {
"type": "text",
"label": "Surname",
"name": "surname",
"placeholder": "Enter surname",
"hidden": true
}];
// Get form data
class FormData extends React.Component {
constructor(props) {
super(props);
this.state = {
items: props.data
};
}
render() {
let els = this.state.items;
return els.map((el, i) => {
return <Input key={i} params={el} />
});
}
}
// Input builder
class Input extends React.Component {
constructor(props) {
super(props);
// Keep state value
this.state = {
value: '',
valid: false,
hidden: this.props.params.hidden
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
this.setState({
value: e.target.value,
valid: e.target.value.length < 5 ? false : true
});
}
render() {
// Element attributes
const {type, label, name, placeholder, hidden} = this.props.params;
const isValid = this.state.valid === true ? <span>Valid! Should show Surname field.</span> : <span>Not valid. Should hide Surname field.</span>;
if (!hidden) {
return (
<div>
{label ? <label htmlFor={name}>{label}</label> : null}
<input
type={type}
name={name}
placeholder={placeholder || null}
value={this.state.value}
onChange={this.handleChange}
/>
{isValid}
</div>
);
} else {
return null;
}
}
}
// App
class App extends React.Component {
render() {
return (
<div>
<h1>Show/Hide test</h1>
<p>What we want here is the surname to appear when firstname has a value (say, it has 5 characters) and hide surname when firstname doesn't.</p>
<FormData data={fieldData} />
</div>
);
}
}
ReactDOM.render(
<form>
<App />
</form>,
document.getElementById('app')
);
【问题讨论】:
-
我会给字段一些唯一的 id 并将状态 1 组件提升到表单,在那里您将拥有一个按 id 提交状态的对象,即
fieldStates: { '001': { value: '', valid: true, hidden: false }, '002': { ... } };。这样我就可以检查一个组件中不同字段的有效性并更改它们的可见性。 -
这就是我在想的……我会使用
FormData中的key属性来存储这些数据吗?在 React 中将数据发送回父组件是一种可接受的模式吗? -
我不确定我是否完全明白如何在这里使用 key 属性...我将
fieldStates存储在FormData状态并在handleInputChange处理程序中定义FormData将传递给 Input 组件,并在此处理程序中更新常见的fieldStates状态。对不起,我不能给出更详细的例子,现在必须运行!如果我能提供帮助,当我回来时,我很乐意解释得更详细。 -
不用担心,谢谢。我对 React 很陌生,所以仍在弄清楚其中的一些概念。
标签: javascript html reactjs