美文网首页
React高级指引(3)

React高级指引(3)

作者: lmmy123 | 来源:发表于2018-10-25 19:05 被阅读19次

Reconciliation(协调)

对比算法

当对比两棵树,React首先比较两个根节点

当根节点变化,React将卸载旧树并重新构建新树

Context

Context通过组件树提供一个传递数据的方法,从而避免了在每一个层级手动的传递props属性
Content设计的目的是为了共享那些被认为对于一个组件树而言是"全局"的数据

// 创建一个 theme Context
const ThemeContext = React.createContext('light')
function ThemedButton(props){
  // ThemeButton 组件从context接收 theme
  return (
    <ThemeContext.Consumer>
      {theme=><Button {...props} theme={theme} />}
    </ThemeContext.Consumer>
  )
}
// 中间件
function ToolBar(props) {
  return (
    <div> <ThemedButton />></div>
  )
}
class App extends React.Component {
  render() {
    return (
      <ThemeContext.Provider value='dark'>
        <ToolBar />
      </ThemeContent.Provider>
    )
  }
}

API

React.createContent

const { Provider, Consumer } = React.createContent(defaultValue)

创建一对 { Provider, Consumer }。当 React 渲染 context 组件 Consumer 时,它将从组件树的上层中最接近的匹配的 Provider 读取当前的 context 值。
如果上层的组件树没有一个匹配的 Provider,而此时你需要渲染一个 Consumer 组件,那么你可以用到 defaultValue 。这有助于在不封装它们的情况下对组件进行测试。

Fragments

React 中一个常见模式是为一个组件返回多个元素。Fragments 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点
Fragments 看起来像空的 JSX 标签: <></>

render() {
  return (
    <>
      <ChildA />
      <ChildB />
      <ChildC />
    </>
  );
}

因为React元素必须使用div标签包裹,针对有些特定的标签,比如<tr>中必须是<td>,而不应该是

<tr>
  <div>
      <td></td>
      <td></td>
   </div>
</tr>

带 key 的 Fragments

<></>语法不能接受键值或熟悉
如果要使用的话,使用 <React.Fragment />

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // 没有`key`,将会触发一个key警告
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

Portals

Portals 提供了一种很好的将子节点渲染到父组件以外的 DOM 节点的方式。

ReactDOM.createPortals(child, container)
// 第一个参数child是任何可渲染的React子元素,第二个参数则是一个DOM元素

Error Boundaries (错误边界)

类似JavaScript try...catch,处理错误机制,针对React组件使用
componentDidCatch(error, info)

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  componentDidCatch(error, info) {
    // Display fallback UI
    this.setState({ hasError: true });
    // You can also log the error to an error reporting service
    logErrorToMyService(error, info);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

未捕获错误的新行为

这一改变有非常重要的意义。自 React 16 开始,任何未被错误边界捕获的错误将会卸载整个 React 组件树。

错误边界无法捕获事件处理器中的错误

可以使用 try/catch 语句

Web Components

高阶组件

类似高阶函数,接收一个组件,并返回一个新组件

Render Props

是指一种在React组件之间使用一个值为函数的prop在React组件间共享代码的简单技术

<DataProvider render={data => (
    <h1>Hello {data.target}</h1>
)} />

相关文章

网友评论

      本文标题:React高级指引(3)

      本文链接:https://www.haomeiwen.com/subject/tkrttqtx.html