React高级特性解析

这篇具有很好参考价值的文章主要介绍了React高级特性解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

react conText

使用API React.createContext 返回的是组件对象 可以利用结构的方式

  • 第一种方式
    使用Provider包裹的组件都可以获取提供者的value

  • Context.Consumer
    组件里面使用函数 函数返回一个组件 函数的参数为Context初始化的参数

  • 第二种方式

  1. 使用Context.Provider包裹所有的组件
  2. 在子组件里面使用static contextType = 创建的Context 则会自动向上查找 然后在组件内部可以通过this.context获取值

Portals插槽

  1. 可以将一个dom插入到其他dom下面ReactDOM.createPortal(需要插入的节点, 需要挂载的节点)

React.createPortal(Component, nodeElement)

HOC

  • 主要存在作用 抽离state 复用逻辑 操作方式可以直接使用ES7装饰器
  • 对一个函数传入一个组件 返回一个组件 函数里面将公共的逻辑抽离出来
  • 例如:每个页面都需要加载数据 渲染页面 那么就可以将公共的获取数据接口抽离出来 对指定组件进行渲染
  • hoc生命周期 组件的didMount -> hocDidMount -> hocwillMount -> hocwillUnMount -> unMount

HOC都有一个通病就是props可能重复

例如:

  1. 每个组件都有共同的操作 比方说:A组件需要修改名字 B组件也需要修改名字 就可以将状态提升 利用HOC 传入修改事件以及传入的值
  2. Loading操作 每个组件都有一个loading状态 利用hoc接收一个loading是否显示的状态 然后用这个loading状态控制显示loading组件还是业务组件
  3. 数据请求 两组同样的数据请求 放在不同的展示组件里面渲染 可以将获取数据的操作抽离出来
    鼠标移动例子 所有的组件都需要获取在某个组件内的鼠标移动x y
const withMouse = Component => {
return class extends React.Component {
    state = {
        x: 0,
        y: 0
    };
    handleMouseMove = event => {
        this.setState({
            x: event.clientX,
            y: event.clientY
        });
    };
    render() {
        return (
            <div onMouseMove={this.handleMouseMove}>
                <Component {...this.props}  mouse={this.state}/>
            </div>
        );
    }
}
}

RenderProps

HOC惊人的相似。当是不会再出现props重复的问题。实际上就是一个回调函数 作用都是获取外部数据

// 例如

将重复的操作放在 组件内部
组件内部通过调用外部的render方法 实现将外部组件可以获取组件内部的state 从而不影响props的传递

class Mouse extends React.Component {
    static propTypes = {
        // render: required
    };

    state = {
        x:0,
        y:0
    };


    handleMouseMove = (event) => {

        this.setState({
            x: event.clientX,
            y: event.clientY
        })
    };


    render() {

        return (
            <div onMouseMove={this.handleMouseMove}>
                {this.props.render(this.state)}
            </div>
        );
    }
}

Refs 转发

  • 主要是不方便获取叶子组件的ref 利用ref转发可以准确的获取的叶子组件的ref
    const ref = React.createRef()
    React.forwardRef((props, ref) => {
        <Component ref={ref}>
    })

ref则会成为叶子组件的ref

Fragments

  • 主要是在代码逻辑中对这些组件进行 不会产生任何的额外节点
<>
  <div>hello</div>
</>

React.lazy React.suspense 懒加载

React.lazy(() => import('./Component'));
  1. 以前是webpack将所有打包成为一个文件 导致文件特别大 不利于代码拆分 这个时候需要代码拆分
  2. const OtherComponent = React.lazy(() => import('./OtherComponent')); 这样导入的组件 如果有多个懒加载组件 那么展示会以加载时间最长的组件显示
  3. React.suspense 参数 fallback 懒加载过程中需要展示的内容
  • 原理分析
  • 当父组件渲染到子组件的时候发现异步请求 直接抛出错误 捕获的结果是个promise
  • ComponentDidCatch捕获到这个promise的异常 pending状态下渲染fallback
  • 当resolve时重新render 遇到下一个异步请求重复上面操作
  • 直到整个父组件抛出的promise对象都将resolve 将loading换成真正的组件

HOOK 钩子

HOOK提供了一系列函数式组件的钩子

const [value, setValue] = useState();

value则是state状态 setValue 则是个函数 需要设置值直接调用setValue 传入需要设置的值即可

  1. useEffect 传入一个匿名函数 该匿名函数的作用相当于DidMount和DidUpdate 可以在匿名函数里面返回一个函数

Component 和 PurComponent 的区别

区别点: 前者自带通过propsstate的浅对比来实现shouldComponentUpdate 而后者没有 只要props变化就会重新render

  • PurComponent缺点
    可能因为深层数据不一致而产生错误的否定判断 从而界面得不到更新
    为什么会产生:新的对象简单的引用了原始对象 改变了新的对象将影响到原始对象 如foo = {a: 1} bar = foo bar.a = 2这个时候区对比foobar是一样的 一般解决是使用深拷贝 则可以 引用immutable 也可以优化

截流和防抖

  1. 截流 控制指定时间触发一次 在指定时间内调用不能超过一次
  2. 防抖 防抖确保函数不会在上一次调用后一定量的时间被执行
  3. requestAnimationFrame 节流 浏览器会确保每一秒是60帧 可以防止每秒超过60帧的操作 自己限流

setState

异步处理 多次增加数据会导致数据返回不到预期 可以使用函数形式处理

为什么使用异步处理?

  • setState不会立马改变React组件和state的值
  • setState通过触发一次组件的更新来引发重绘
  • 多次setState函数调用产生的效果会合并

参考来源:憧憬在 aoppp.com发布文章来源地址https://www.toymoban.com/news/detail-491770.html

到了这里,关于React高级特性解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react的context和contextType

    Context 是 React 提供的一种用于在组件树中共享数据的机制。 它允许您在组件之间传递数据,而不需要手动通过 props 层层传递。 Context 包括两个主要的组件:Context.Provider 和 Context.Consumer。 ContextType 用于订阅单一的 context 设置 class.contextType 为 React.createContext() 创建的 context 对象

    2024年02月13日
    浏览(24)
  • React 状态管理 - Context API 前世今生(下)

    Provider【context的生产者组件】 createContext 创建一个Context对象,订阅了整个Context对象的组件,会从组件树中离自身最近的那个匹配的Provider中读取到当前的context值。 Context.Provider 父Context对象返回的Provider组件,允许消费组件订阅context的变化。 Consumer【context的消费者组件】 C

    2024年02月07日
    浏览(39)
  • React中的setState使用细节和原理解析

    前面我们有使用过setState的基本使用, 接下来我们对setState使用进行详细的介绍 使用setState的原因 开发中我们并不能直接通过修改state的值来让界面发生更新 : 因为我们修改了state之后,希望React根据最新的State来重新渲染界面,但是 this.state 这种方式的修改React并不知道数据发

    2024年02月03日
    浏览(42)
  • react当我们有两个完全不相关的组件想要通信时,就可以利用这种模式,其中一个组件负责订阅某个消息,而另一个元素则负责发送这个消息。使用Context配合

    在nextjs项目中,发现两个组件没啥关系,例如一个是一直存在的头部组件,另一个是页面中的组件,当我点击头部组件中的特定按钮时,把数据传递到页面组件中,页面组件接受到canshu数据后在做其他操作,那么他们两个如何通讯,通过context配合观察者模式实现。 首先在其

    2024年02月15日
    浏览(49)
  • React Native Ref转发/Memo缓存/HOC高阶组件/Context上下文

    1、使用自定义组件时,实现外层组件对原始组件(TextInput)的操作 外层组件使用 ref 属性 子组件使用 forwardRef 包裹 2、函数式组件对外暴露实例方法(cusomFocus) 子组件 父组件如图一所示 1 、 避免多余渲染 问题:每次点击按钮都会导致 InfoView 组件发生重绘,即使每次 setI

    2024年01月21日
    浏览(51)
  • 【React】React学习:从初级到高级(四)

    当希望组件“记住”某些信息,但又不想让这些信息触发新的渲染时,可以使用 ref 。 4.1.1 给组件添加 ref 导入 useRef() 调用 useRef 可以用 ref.current 属性访问该 ref 的当前值,例如: 设置 state 会重新渲染组件,更改 ref 不会!当一条信息用于渲染时,将它保存在 state 中。当一条

    2024年02月09日
    浏览(30)
  • 【React】React学习:从初级到高级(一)

    组件是用户界面UI的构成要素。创建一个组件可以分为三步: 1.1.1 创建组件 导出组件 export default 定义函数 function name(props) {} 定义组件的时候,组件的名称必须以大写字母开头,否则将无法运行。 HTML 标签是小写的 添加标签 JSX (使用 JavaScript ) TSX (使用 TypeScript ) 注意:如果标

    2024年02月10日
    浏览(27)
  • 【React】React学习:从初级到高级(二)

    在 React 中,随时间变化的数据被称为状态( state )。 事件处理程序是开发者自己写的的函数,它将在用户交互时被触发,如点击、悬停、焦点在表单输入框上等等。 button 等内置组件只支持内置浏览器事件,如 onClick 。但是,开发者也可以创建自己的组件,并给它们的事件

    2024年02月10日
    浏览(24)
  • React18 新特性

    定义 渲染赋值 同步不可中断更新机制 - 异步可中断并行 状态更新 机制 React18 默认开启并发模式 详见代码 ReactDOM 的引入 render startTransition 函数可以将 state 更新标记为 非阻塞的 transition useTransition 是一个让你在不阻塞 UI 的情况下来更新状态的 React Hook isPending 标志,告诉你是

    2024年02月09日
    浏览(32)
  • React18新特性?

    hello world欢迎来到前端的新世界 😜当前文章系列专栏:react.js 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹 💖感谢大家支持!您的观看就是作者创作的动力 早在 React 18 之前,React 就已经可以对 stat

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包