百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

尤雨溪带你实现一个mini vue_尤雨溪面试

qiyuwang 2025-02-20 17:41 15 浏览 0 评论

前言

本篇文章主要是解析尤雨溪在codepen上实现的一段mini-vue(solution)代码。

前面的文章,我们学习了怎么把数据变成响应式,怎么用虚拟dom局部刷新页面,现在我们在这两者的基础上,看怎么实现一个mini vue。

代码解析

先把所有的代码折叠起来看一下:

可以看到,在响应式、虚拟dom的实现上,和前文一模一样,只是在这两个功能上,增加了1个createApp函数,那么接下来我们主要看看createApp函数干了什么。

首先我们初始化了一个叫Component的常量,这个常量内部有data和render函数,data返回了{ count: 0 },render返回一个虚拟dom,渲染这个虚拟dom就会向页面中添加一个div,div中显示count的值,并绑定了点击事件,点击div就让count自增1。(虚拟dom渲染不清楚的话,可以看看上文)

const Component = {
  data() {
    return {
      count: 0
    }
  },
  render() {
    return h(
      'div',
      {
        onClick: () => {
          this.count++
        }
      },
      String(this.count)
    )
  }
}

然后我们来看看createApp函数:

function createApp(Component, container) {
  // implement this
  const state = reactive(Component.data())
  let isMount = true
  let prevTree
  watchEffect(() => {
    const tree = Component.render.call(state)
    if (isMount) {
      mount(tree, container)
      isMount = false
    } else {
      patch(prevTree, tree)
    }
    prevTree = tree
  })
}

// calling this should actually mount the component.
createApp(Component, document.getElementBy('app'))

进入函数后,首先将Component.data(){ count: 0 }变成响应式后赋值给state,然后申明两个变量isMount和prevTree,然后调用watchEffect:

function watchEffect(effect) {
  activeEffect = effect
  effect()
  activeEffect = null
}

那么就执行了effect函数,申明并初始化tree常量,Component.render.call(state)的意思是执行Component中的render函数,并把render函数内的this指向state。

初次createApp时,isMount是true,所以接下来就直接渲染tree,并将isMount变成false,后面count数据变化时,触发effect函数再次走到if (isMount)这个判断时,isMount值就都是false,从而patch(prevTree, tree),用新的tree对前一个tree打补丁,即局部刷新页面。

每次渲染或局部刷新完页面,就把当前的tree赋值给prevTree。

现在一个mini vue就实现了,点击页面上的0,0就会变成1,每次点击页面上的数字,数字就自增1。
(响应式和虚拟节点相关代码这里就不贴了,有需要去前文看,或者直接去codepen)

总结

简单来说,之前实现的数据响应式,在使用时,只是在数据变化时把数据打印出来:

watchEffect(() => {
  console.log(state.count)
})

现在只是把watchEffect的传参effect的功能改一下,从简单的打印,改成渲染或局部更新页面,并且运用虚拟dom提高页面性能。从而实现数据变化时,页面自动局部刷新,也就是数据驱动视图。

相关推荐

centos7使用yum安装nginx+php7+mysql5.6

本文主要介绍安装在centos7下如何安装nginx+php+mysql的环境,centos7的版本自带安装源的版本无法实现PHP5.4以上的版本,数据库默认用的是mariadb,文章介绍的安装是如何...

Linux基础入门(VMWare中CentOS7配置yum)

上一章节,介绍了《Linux基础入门(CentOS7下通过命令行配置网络)》,本章将介绍如何配置yum源,方便后续在学习和使用的过程中,对所需工具的安装;...

CentOS 7搭建Nextcloud私有云(centos搭建云盘)

Nextcloud简介:对于私人网盘,其中最出名的就是seafile、owncloud和nextcloud。seafile是国人开发的,有免费和企业版,免费的功能有限;nextcloud是owncl...

分享一个docker镜像源地址,解决docker不能拉取的问题

自己搭建的代理,centos7只需要修改/etc/docker/daemon.json并输入以下内容:{"registry-mirrors":["https://next...

源支付5.18版全套开源源码客户端+云端+监控+协议三网免挂免输入

源支付5.18最新版协议去授权全套三端开源源码_客户端+云端+监控+协议三网免挂免输入(全套版)推荐系统为:CentOS7.6Linux系统环境:Nginx1.20.1+MySQL5.6....

centos7飞速搭建zabbix5.0并添加windows、linux监控

一、环境zabbix所在服务器系统为centos7,监控的服务器为windows2016和centos7。二、安装zabbix官方安装帮助页面...

CentOS上配置 Docker 使用代理服务器

hub.docker最近总被墙,国内大厂搞的docker镜像源代理被封被停,对于一个严重依赖一些海外项目的软件开发人员,简直没法干活了。docker要在CentOS上配置Docker使用代理服...

CentOS 7 (阿里云虚拟机) 安装 Docker

一、安装Docker1.使用root权限登录CentOS。确保yum包更新到最新sudoyumupdate...

Centos离线静默安装 oracle11g,步骤细验证成功

一、环境要求1.1.涉及工具及环境1)CentOS764位系统2)oracle安装包文件a)linux.x64_11gR2_database_1of2.zip...

Linux运维之制作指定软件包的YUM源

#挑战30天在头条写日记#关注我,不迷路,大家好,我是大王。--记录运维中遇到的故障及排查方法...

在CentOS 9 安装Nvidia显卡驱动详细操作步骤

今天给粉丝网友演示CentOS9系统下如何安装nvidia显卡驱动。·将下载好的显卡驱动放到文件夹中,这里以download为例,放入文件夹中开始对系统软件升级,是为了防止在安装显卡驱动时显示报错...

基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)

前言:由于公司业务服务器大部分都在内网环境下运行,内网环境无法直接使用yum安装升级更新软件,所以需要自建Yum源来满足目前日常工作需要。...

最新zabbix一键安装脚本(基于centos8)

一、环境准备注意:操作系统必须是centos8及以上的,因为我配的安装源是centos8的。并且必须连接互联网,脚本是基于yum安装的!!!...

CentOS7中使用yum安装Nginx的方法

1、添加源  默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址。因此可以如下执行命令添加源(...

Centos8出现Failed to download metadata for repo 'AppStream'解决

大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误“错误:Failedtodownloadmetadataforrepo'AppStre...

取消回复欢迎 发表评论: