相关文章推荐
腼腆的水龙头  ·  python 列表操作方法详解 - ...·  6 月前    · 
重感情的饭卡  ·  Redteam2靶场最后使用sam_the_ ...·  7 月前    · 
高大的李子  ·  坑爹的Microsoft.Data.Sqli ...·  1 年前    · 
紧张的花生  ·  达梦数据库ODBC连接报错,[ISQL]ER ...·  1 年前    · 
Code  ›  react组件children变化不触发视图更新_react 的diff如何不让子组件更新_胖鹅68的博客
https://blog.csdn.net/hbiao68/article/details/119895499
玩手机的啄木鸟
1 年前
  • 一、文章参考
  • 二、props.children
    • 2.1 快速入门
    • 2.2 函数组件获取children
    • 2.3 class组件获取children
  • 三、React.Children
    • 3.1 API 介绍
  • 四、react组件children变化不触发视图更新
    • 4.1 问题介绍
    • 4.2 问题分析
    • 4.3 渲染知识点
    • 4.4 解决办法

    一、文章参考

    1. React.Children API 介绍

    二、props.children

    它包含组件的开始标签和结束标签之间的内容

    2.1 快速入门

    在组件之间,添加元素内容,例如:

    <Welcome>Hello world!</Welcome>
    

    2.2 函数组件获取children

    function Welcome(props) {
      return <p>{props.children}</p>;
    

    2.3 class组件获取children

    class Welcome extends React.Component {
      render() {
        return <p>{this.props.children}</p>;
    

    三、React.Children

    React.Children 提供了用于处理 this.props.children 不透明数据结构的实用方法

    3.1 API 介绍

    1. React.Children.map

    React.Children.map(children, function[(thisArg)])
    

    在 children 里的每个直接子节点上调用一个函数,并将 this 设置为 thisArg

    注意:如果 children 是一个 Fragment 对象,它将被视为单一子节点的情况处理,而不会被遍历。

    2. React.Children.forEach

    与 React.Children.map() 类似,但它不会返回一个数组。

    3. React.Children.count

    返回 children 中的组件总数量,等同于通过 map 或 forEach 调用回调函数的次数。

    4. React.Children.only

    React.Children.only(children)
    

    验证 children 是否只有一个子节点(一个 React 元素),如果有则返回它,否则此方法会抛出错误。

    注意: React.Children.only() 不接受 React.Children.map() 的返回值,因为它是一个数组而并不是 React 元素。

    5. React.Children.toArray

    React.Children.toArray(children)
    

    将 children 这个复杂的数据结构以数组的方式扁平展开并返回,并为每个子节点分配一个 key
    例子

    四、react组件children变化不触发视图更新

    4.1 问题介绍

    1. 创建一个布局组件

    2. 将页面的的内容通过其他组件定义

    3. 根据state中的数据变化,触发 内部的children变化

    class LoginPage extends BaseComponent {
      constructor (props) {
        super(props)
        this.state = {
          panelType: 'login' // 面板的状态 login  scan  findpwd1  findpwd2
      // 改变面板的内容
      changePanel (type) {
        this.setState({
          panelType: type
      // 获取面板的内容
      getPanelHtml () {
        const { panelType } = this.state
        let result = null
        if (panelType === 'login') {
          result = <LoginFormComp {...this.props} changePanel={this.changePanel.bind(this)}></LoginFormComp>
        } else if (panelType === 'scan') {
          result = <ScanQRComp {...this.props} changePanel={this.changePanel.bind(this)}></ScanQRComp>
        } else if (panelType === 'findpwd1') {
          result = <FindPwdOne {...this.props}></FindPwdOne>
        } else if (panelType === 'findpwd2') {
          result = <FindPwdTwo {...this.props}></FindPwdTwo>
        return result
      render () {
        const { panelType } = this.state
        const panelHtml = this.getPanelHtml()
        return (
          <CommonPanelWrap>
            {panelHtml}
          </CommonPanelWrap>
    

    4.2 问题分析

    1. 将逻辑组件 直接放到 布局组件 中可以显示

    2. 断点调试,确信 组件已经重新渲染了,并且children 发生了变化

    3. 测试 state变化,将 和业务组件绑定一起重新渲染,界面会发生变化

    功能实现问题不大了:最差的办法就是状态变化,就把<CommonPanelWrap>布局组件和业务组件一起渲染,虽然布局组件没有任何变化

    1. 推测 组件阻止了视图的变化,因为布局组件确实从来没有变化,导致react 的diff算法任务没有变化,就不会重新渲染

    验证办法:将布局组件添加一个key,这个key就是 state.panelType 的值

    4.3 渲染知识点

    1. React的diff 算法不是针对整棵树,知识针对当前节点及节点一下的子节点;如果当前节点没有变化,就不会继续渲染当前节点下的子节点

    2. diff 判断是否重复的依据就是key

    4.4 解决办法

    在布局中添加 key 用来标识: <CommonPanelWrap key={panelType}>

    render () {
      const { panelType } = this.state
      const panelHtml = this.getPanelHtml()
      return (
        <CommonPanelWrap key={panelType}>
          {panelHtml}
        </CommonPanelWrap>
    我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷
    在日常的工作过程中 会遇到各种各样的问题 今天就是遇到一个问题 子组件的state更新之后视图不更新
                    renderSectionHeader={this._sectionComp}
                    renderItem={this._renderListRow}
                    sections={this.state.dataBlobSort}
    const UpdateQuestion = () => {
      let state = {
        arr: ["a", "b", ["d", "e", "f"], ["1", "2", "3"]],
        obj: {
          msg: "ok",
          data: {
            page: 10,
            list: [
    const [textList, setTextList] = useState(原数组);
    setTextList(新数组);
    当修改原数组时,如果原数组是个深层数组(不只一层),使用setTextList修改时,不会触发页面刷新
    原因分析:
    这个涉及到可变对象和不可变对象的知识,在vue和react中,如果更新可变对象时,可能会引起视图更新,这是因为,vue和react默认都是浅监听,只会监听数据的第一层,内层数据发生改变,并不会监听到
                                        React入门,大神轻喷哈^_^下面的代码是建立在React 0.14.*版本的今天在尝试封装React component的时候碰到了几个问题,猜小白们学习React中可能会碰到,我就整理下希望能帮助到小白们。Keyword: props children cloneElement
    React父子组件交流一般是用props传递,比如:
                                        React的核心为组件。你可以像嵌套HTML标签一样嵌套使用这些组件,这使得编写JSX更加容易因为它类似于标记语言。
    当我刚开始学习React时,当时我认为“使用 props.children 就这么回事,我知道它的一切”。我错了。。
    因为我们使用的事JavaScript,我们会改变children。我们能够给它们发送特殊的属性,以此来决...
    本组件继承自PureComponent而非通常的Component,这意味着如果其props在浅比较中是相等的,则不会重新渲染。所以请先检查你的renderItem函数所依赖的props数据(包括data属性以及可能用到的父组件的state),如果是一个引用类型(Object或者数组都是引用类型),则需要先修改其引用地址(比如先复制到一个新的Object或者数组中),然
                                        React组件中对子组件children进行加强
    如何对组件的children进行加强,如:添加属性、绑定事件,而不是使用{this.props.children}在上进行处理。
    今天写组件遇到这个问题,在网上查阅了很多资料,都说可以使用React.cloneElement进行处理,但是结果并不是预期想要的。
    先看看这个东西有什么用:
    React.cloneElement(elem...
    
 
推荐文章
腼腆的水龙头  ·  python 列表操作方法详解 - 战争热诚 - 博客园
6 月前
重感情的饭卡  ·  Redteam2靶场最后使用sam_the_admin.py想要获得域控制器权限的时候报错_安全-CSDN问答
7 月前
高大的李子  ·  坑爹的Microsoft.Data.Sqlite没有SQLiteDataAdapter,如何实现读取datatatable和dataset,C#,VBnet-CSDN博客
1 年前
紧张的花生  ·  达梦数据库ODBC连接报错,[ISQL]ERROR: Could not SQLConnect_qq_39799494的博客-CSDN博客
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号