这是我的react functional component
,我发送的输入为props
,这些输入将被显示,然后循环输入以检查根据条件显示哪些输入。这是我的组成部分: -
const TopInputComponent = (props) => {
const inputs = props.inputs;
inputs.map((input,index)=>{
if(input.type == "textInput"){
return (<Textfield key={index}
onKeyDown={(event)=>{
if(event.key == "Enter"){
onFilterSelected({'min_price':parseInt(event.target.value)});
}
}}
label={input.placeholder}
floatingLabel
/> )
}else if(input.type == "selectInput"){
return (<div key={index}>
<label>{input.placeholder}</label>
<select >
<option value="1">1</option>
<option value="2">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</div>)
}
})
}
我收到此错误:
“必须返回有效的React元素(或null)。您可以拥有 返回undefined,数组或其他一些无效对象。“
答案 0 :(得分:3)
有两个,三个,可能有四个问题:
您没有从函数中返回任何内容,因为您没有返回 map
的结果。
React组件必须返回单个元素或null
,它不能返回数组。
在map
回调中,如果input.type
为"textInput"
或"selectInput"
,您只会返回一些内容,而不是其他内容。这会在结果数组中留下undefined
个值。如果这些是唯一两个可能的值,请将else if(input.type == "selectInput"){
更改为} else {
。如果没有,请处理其他案件。
floatingLabel
的开始标记中的 Textfield
似乎很奇怪,它将是一个独立的布尔属性。
所以你可能想要将这些元素包装成某些东西,也许是div
(参见***
行):
const TopInputComponent = (props) => {
const inputs = props.inputs;
return <div>{inputs.map((input,index)=>{ // ***
if(input.type == "textInput"){
return (<Textfield key={index}
onKeyDown={(event)=>{
if(event.key == "Enter"){
onFilterSelected({'min_price':parseInt(event.target.value)});
}
}}
label={input.placeholder}
floatingLabel
/> )
} else { // *** Removed: if(input.type == "selectInput"){
return (<div key={index}>
<label>{input.placeholder}</label>
<select >
<option value="1">1</option>
<option value="2">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</div>)
}
})}</div>; // ***
}
简化实时示例:
const MyComponent = props => {
const {inputs} = props;
return <div>
{inputs.map((input, index) => <input key={index} type={input.type} name={input.name} value={input.value || ''} />)}
</div>;
};
ReactDOM.render(
<MyComponent inputs={[
{type: "text", name: "one"},
{type: "button", name: "btn", value: "Click me"}
]} />,
document.getElementById("react")
);
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
答案 1 :(得分:0)
在map
内,您将返回元素,这些元素将按array
分组为map
(返回array
),您需要return
map
的结果也是。您正在返回一个数组但反应组件无法返回一个数组,因此将map
结果包装在div
内。
使用此:
const TopInputComponent = (props) => {
const inputs = props.inputs;
return <div> { inputs.map((input,index)=>{ //added return
....
另一个问题是,在map
内,如果你没有默认返回任何内容,它将返回undefined
,你正在使用两个条件,如果它们都不是{{} 1}},在这种情况下将返回true
。因此,请始终使用undefined
案例,以这种方式使用它:
default
检查此示例:
return a.map(el => {
if(/*condition 1*/)
return //1;
else if(/*condition 2*/)
return //2;
else
return //3;
})
&#13;