我有一个通知组件,我有一个超时设置。超时后,我调用this.setState({isTimeout:true})。
我想做的是,如果已经超时,我只想渲染什么:
render() {
let finalClasses = "" + (this.state.classes || "");
if (isTimeout){
return (); // here has some syntax error
}
return (<div>{this.props.children}</div>);
}
问题是:
返回();//这里有一些语法错误
是的,你可以,但不是空白,如果你不想从组件中呈现任何东西,只需返回null,就像这样:
return (null);
另一个重点是,在JSX中,如果你是有条件地呈现元素,那么在condition=false的情况下,你可以返回这些值中的任何一个false, null, undefined, true。根据DOC:
布尔值(true/false)、null和undefined都是有效的子类型,
他们将被忽略意味着他们只是不渲染。
所有这些JSX表达式将呈现为相同的东西:
<div />
<div></div>
<div>{false}</div>
<div>{null}</div>
<div>{undefined}</div>
<div>{true}</div>
例子:
只有奇数值才会被呈现,因为偶数值将返回null。
const App = ({ number }) => {
if(number%2) {
return (
<div>
Number: {number}
</div>
)
}
return (null); //===> notice here, returning null for even values
}
const data = [1,2,3,4,5,6];
ReactDOM.render(
<div>
{data.map(el => <App key={el} number={el} />)}
</div>,
document.getElementById('app')
)
<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>
<div id='app' />
有些答案是稍微不正确的,并且指向了文档的错误部分:
如果你想让一个组件什么都不呈现,只需要返回null,就像每个doc:
在极少数情况下,您可能希望组件隐藏自己
由另一个组件呈现。要做到这一点,返回null而不是
它的渲染输出。
例如,如果你试图返回undefined,你会得到以下错误:
渲染没有返回任何东西。这通常意味着回报
语句缺失。或者,为了不呈现任何内容,返回null。
正如其他答案所指出的,null, true, false和undefined都是有效的子元素,这对于jsx中的条件渲染非常有用,但如果你想让你的组件隐藏/渲染任何东西,就返回null。
EDIT React 18:
React 18将允许未定义的渲染而不是抛出。请看这个公告。
对于那些提出这个问题的开发人员,他们可以检查在组件中哪里可以返回null,而不是在三元模式下检查是否渲染组件,答案是肯定的,你可以!
我的意思是,在你的JSX中渲染你的组件的部分,而不是这个垃圾三元条件:
// some component body
return(
<section>
{/* some ui */}
{ someCondition && <MyComponent /> }
or
{ someCondition ? <MyComponent /> : null }
{/* more ui */}
</section>
)
你可以检查你的组件中的than条件,像这样:
const MyComponent:React.FC = () => {
// get someCondition from context at here before any thing
if(someCondition) return null; // i mean this part , checking inside component!
return (
<section>
// some ui...
</section>
)
}
只是考虑在我的情况下,我提供了someCondition变量从上下文在上层组件(例如,只是考虑在你的脑海中),我不需要支撑钻的someCondition在MyComponent。
看看你的代码在那之后得到了多么干净的视图,我的意思是你不需要在你的JSX内部使用三元操作符,你的父组件会像下面这样:
// some component body
return(
<section>
{/* some ui */}
<MyComponent />
{/* more ui */}
</section>
)
MyComponent将为您处理其余的事情!