若是返回数组必须给每个数组元素添加一个惟一标识key,可是从v16.2开始reatreact
// 第一种返回数组 render() { // 这里不一样于v15.x必需要一个标签来包裹 return [ // key是必须的,通常不要把数组的index索引做为key,这样可能会致使页面不会按照你想象的效果进行渲染 <li key="A">First item</li>, <li key="B">Second item</li>, <li key="C">Third item</li>, ]; } // 第二种返回字符串 render() { return 'Look ma, no spans!'; }
以前react在渲染过程当中或者是生命周期内出现了致命的错误,react会从根组件上把全部的组件都卸载下来,以防止展示错误的数据,但这不是最好的用户体验。React 16修复了这一点,引入了Error Boundary的概念,中文译为“错误边界”,当某个组件发生错误时,咱们能够经过Error Boundary捕获到错误并对错误作优雅处理。(注:它并不能捕获runtime全部的错误,好比组件回调事件里的错误,能够把它想象成传统的try-catch语句)api
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } // 新增了componentDidCatch这个生命周期函数,它能够捕获自身及子树上的错误并对错误作优雅处理,包括上报错误日志、展现出错提示,而不是卸载整个组件树。 componentDidCatch(error, info) { // 错误代理组件的展现与否 this.setState({ hasError: true }); // 在这里咱们能够对错误进行记录 logErrorToMyService(error, info); } render() { if (this.state.hasError) { // 在这里咱们能够书写本身想要展现的ui组件 return <h1>Something went wrong.</h1>; } return this.props.children; } }
上面的组件是当页面中有错误时咱们想要展现的效果,具体用法以下:数组
render(){ return ( <div> <ErrorBoundary> // 外层组件咱们定义的错误组件 <Profile user={this.state.user} /> // 内层组件是咱们将要监视的自定义组件 </ErrorBoundary> <button onClick={this.onClick}>Update</button> </div> ) }
以前的setState无论传入什么只要调用了这么方法就会渲染服务器
selectCity(e){ const newValue = e.target.value; this.setState((state)=>{ if(state.city===newValue){ return null; } return {city:newValue} }) )