从零写一个 Vue(一)主流程实现

写在前面vue3 马上要来了,vue2 学会了吗?最近看到了不少类似标题的文章,虽然 vue 的双向绑定、虚拟dom、diff算法等等面试常见问题你可能在几年前就学过了,不过让从零开始实现一个 vue,你可以吗。本着学习的最好方法就是自己实现一次的原则,趁着疫情无法返校,计划实现一个尽量完整的 vue,删掉了 flow 和很多的类型判断,只保留各功能的主流程,旨在为直接阅读 vue 源码提供过渡。毕竟 vue 源码还是比较难啃的,看网上的文章也很难将各个模块联系起来。跟着我先搭起整个框架,然后一个功
摘要由CSDN通过智能技术生成

写在前面

vue3 马上要来了,vue2 学会了吗?

最近看到了不少类似标题的文章,虽然 vue 的双向绑定、虚拟dom、diff算法等等面试常见问题你可能在几年前就学过了,不过让从零开始实现一个 vue,你可以吗。

本着学习的最好方法就是自己实现一次的原则,趁着疫情无法返校,计划实现一个尽量完整的 vue,删掉了 flow 和很多的类型判断,只保留各功能的主流程,旨在为直接阅读 vue 源码提供过渡。

毕竟 vue 源码还是比较难啃的,看网上的文章也很难将各个模块联系起来。跟着我先搭起整个框架,然后一个功能一个功能的实现 vue 的主流程,抛开 flow 和类型判断,专注于源码的实现原理,是从小白到直接阅读源码之间一个很好的过渡。

仅供学习交流使用,觉得看文章太慢的可以直接看源码:https://github.com/buppt/YourVue

本篇文章是从零实现 vue2 系列第一篇,vue 主流程实现,先不要管双向绑定、虚拟dom 等等,后面会一点一点加上来。

正文

我们按照 vue 的方式,实现功能,一个数字和一个按钮,点击按钮数字加一。

// main.js
import YourVue from './instance'
new YourVue({
   
  el: '#app',
  data: {
   
      count: 0,
  },
  template: `
      <div>
        <div>{
    {count}}</div>
        <button @click="addCount">addCount</button>
      </div>
  `,
  methods:{
   
      addCount(){
   
          const count = this.count + 1
          this.setState({
     // 没有双向绑定,先通过setState更新
              count
          })
      }
  }
})

实现

首先初始化一个 class,这里需要关注的问题有三个

  1. 第一个是如何实现 data 和 methods 中的变量通过 this 直接访问
  2. 第二个如何将 template 模版转换成 dom 元素
  3. 第三个是如何将事件绑定到 dom 元素上面

先上 YourVue 定义。

export default class YourVue{
   
    constructor(options){
   
        this._init(options)
    }
    _init(options){
   
        this.$options = options
        if (options.data) initData(this)
        if (options.methods) initMethod(this)
        if (options.el) {
   
            this.$mount()
        }
    }
    $mount(){
   
        this.update()
    }
    update(){
   
        let el = this
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值