Skip to content

React 高级用法

仲灏约 1 分钟

React 高级用法

函数组件

函数组件没有实例,也不能监听各个生命周期,也无法扩展属性和方法。只是输入 props ,输出 jsx ,纯函数。

js
// class 组件
class List extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        const { list } = this.props

        return <ul>{list.map((item, index) => {
            return <li key={item.id}>
                <span>{item.title}</span>
            </li>
        })}</ul>
    }
}

// 函数组件
function List(props) {
    const { list } = this.props

    return <ul>{list.map((item, index) => {
        return <li key={item.id}>
            <span>{item.title}</span>
        </li>
    })}</ul>
}

非受控组件

先回顾受控组件

要点:

  • ref
  • defaultValue defaultChecked
  • 手动操作 DOM 元素

使用场景,必须通过 DOM 节点才能操作的:

  • 文件上传 <input type="file">
  • 有些富文本编辑器,要求通过 DOM 节点渲染

受控 vs 非受控

  • 优先使用受控组件,符合 React 的设计思路
  • 必须操作 DOM 的才考虑非受控组件

Portals

Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案。

以下情况可能要考虑使用 Portal

  • 组件有 overflow: hidden (其他命中 BFC 的情况),导致了渲染问题
  • 父组件有 z-index 导致了渲染问题
  • 用到 fixed 等需要跳出父组件

context

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。 例如:地区偏好,UI 主题。这些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。

  • React.createContext(defaultValue) 创建 Context
  • Context.Provider 最外层父组件
  • Class.contextType 和 this.context - 用于类组件
  • Context.Consumer - 用于函数组件

异步组件 懒加载

  • import() 语法,可回顾 vue 动态组件
  • React.lazy 动态引入 React 组件
  • React.Suspense 实现 loading 效果
js
import("./math").then(math => {
  console.log(math.add(10, 20))
})

上次更新:

讨论区

欢迎留下想法与补充