IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React中的Fiber更新机制如何执行的setState -> 正文阅读

[JavaScript知识库]React中的Fiber更新机制如何执行的setState

一、认识链表

概率:链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

1、实现一个单链表

/** 链表节点类*/
class Node{
    constructor(val){
        this.val = val		//节点所存值
        this.next = null    //指针,指向下一个节点
    }
}
/** 链表类*/
class LinkList{
    constructor(){
        this.head = null    //链表头
        this.length = 0		//链表长度
    }
	/** 新增节点并加入链表*/
    add(val){
        let node = new Node(val)   
        if(this.head == null){      //若表头为空,则将节点放入表头
            this.head = node
            this.length++
        }else{
            let current = this.head
            while(current.next){      //循环,直到链表的指针为空
                current = current.next
            }
            current.next = node
            this.length++
        }

    }
}


let list1 = new LinkList()

list1.add(1)
list1.add(2)
list1.add(3)
list1.add(4)
console.log(list1)

2、输出结果如下:链表结果
在这里插入图片描述

二、setState 状态更新机制

疑问:
1、setState是同步还是异步?
2、setState为何可以传对象又可以传一个函数?

接下来解决这些疑问:

函数setState调用关系主要分为以下两个部分:
1、将要更新的状态添加到更新队列中;
2、产生一个调度任务。调度任务会遍历更新队列并计算出最终要更新的状态,将其更新到组件实例中,然后完成组件渲染操作。

1、将要更新的状态添加到更新队列中,看看代码的实现

class Queue{
    constructor(payload){
        this.payload = payload
        this.nextNode = null
    }
}


class ListQueue{
    constructor(){
        this.firstNode = null   //链表头
        this.lastNode =null		//链表尾
        this.initState = {}		//初始值
    }
	//	将每一个setState任务加入链表队列中
    enqueue(queue){
        if(this.firstNode ==null){
            this.firstNode = this.lastNode =queue
        }else{
            this.lastNode.nextNode = queue
            this.lastNode = queue
        }
    }
}

let listQueue =new ListQueue()


listQueue.enqueue(new Queue({num:1}))
listQueue.enqueue(new Queue({num:2}))
listQueue.enqueue(new Queue((state)=>{state.num++}))
listQueue.enqueue(new Queue({id:5}))

2、调度任务遍历更新队列

class ListQueue{
    constructor(){
        this.firstNode = null
        this.lastNode =null
        this.initState = {}
    }

    enqueue(queue){
        if(this.firstNode ==null){
            this.firstNode = this.lastNode =queue
        }else{
            this.lastNode.nextNode = queue
            this.lastNode = queue
        }
    }
	
	//调度更新方法
    forceUpdate(){
        let current = this.firstNode
        let currentState = this.initState
        while(current){   //依次取出每一个节点值  更新
            let updateState = typeof current.payload =='function'?current.payload(currentState):current.payload   //判断对象还是函数
            currentState ={...currentState,...updateState
            }    //覆盖原来值
            current = current.nextNode
        }
        return currentState
    }
}

3、最后执行一下listQueue.forceUpdate()就可以将state中的值改变了

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:19:49  更:2022-11-05 00:22:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 15:06:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码