vue3.0 -初探 -持续更新中

一.创建vue工程方式有两种

  • 传统的 vue-cli 方式
##首先保证本地的vue-cli版本在4.5.0以上
vue --version
##如果不是,先升级最新的vue-cli工具
npm i -g @vue\vue-cli
## 然后和之前的创建vue2的方式一样。
vue init webapack <project-name> ## 打包工具指定的是webpack
## 在后续list中,选择[vue3]即可。

传统的方式创建vue3,也没问题,但是这样一来的打包工具仍然是webpack。

  • 使用 vite 创建
## 创建工程
npm init vite-app <project-name> # 指定了脚手架为vite 以及项目框架是vue3.x [为什么是vue3.0框架?因为这个vite工具就是vue3开发团队写的,所以人家直接默认就用 vite-app 创建的项目就是基于 vue3.0]

## 进入功能目录
cd <project-name>
## 安装依赖
npm install
## 运行 
npm run dev

使用 vite 方式创建,打包工具就是 vite 了,项目也没有什么 build 文件夹,以及一堆 webpack.config.js webpack.base.js xxxxxx

二、 vue3.0中main.js文件

在 vue2.x 中,我们的 main.js 是这么写的。

import Vue from 'vue'
import App from './App'

const vm = new Vue({
    render(h) => h(App)
})
vm.$mount('#app')

在 vue3.0中是这么写的。

import { createApp } from 'vue'
import App from './App'

const app = createApp(App)
app.mount('#app')

在vue2.0中,我们直接调用 new Vue 构造函数创建一个vm实例。在v3.0中,我们使用 createApp函数,传递进去一个options对象,来创建一个app实例。 后面的挂载都是一样的。

你把 app 和 vm 打印到控制台查看一下,就会发现 app 比 vm 属性少很多,也就是说 vue3.0 里的 app 更为轻量。

三、 Vue3.0中的 setup 函数

在 vue2.x 中,我们定义组件的数据,方法,计算属性,watch等都是以配置选项的方式来进行的。

export default {
    name: 'App',
    data () {
        return {
            num:1
        }
    },
    methods: {},
    computed: {},
    watch: {}
}

在 vue3.0 中,所有需要的上述组件配置,都应该定义在 setup 函数里,并返回。(为什么要返回?返回才会挂载在当前组件实例上,才能在模板中使用。)

export default {
    name: 'App',
    setup () {
        // 我定义的函数
        // 我定义的数据
        // 我定义的watch
        // 我定义的计算属性
        // .....
        return {
            我定义的函数,
            我定义的数据,
            我定义的,
            我定义的计算属性
        }
    }
    
}

四、vue3.0中的ref函数

vue2.0 和 vue3.0 配置数据响应式也有区别。

在 vue2.0中,我们把数据放在 data 选项里,就可以完成响应式的配置了。

在vue3.0中,提供了更精细化的响应式数据配置。

// vue3.0 ref 函数功能说明
import { ref } from 'vue'
export default {
    name: 'App',
    setup () {
        // 定义一个基本数据类型响应式
        let num = ref(100)
        // 返回的是一个 RefImpl 的对象 RefImpl { ......}
        // 使用num
        num.value = 100  // 触发setter
        console.log(num.value) // 触发getter
        // 定义一个对象类型数
        let obj = ref({
            name: '张三-老工具人了',
            job: {
                detail: {
                    title: '前端开发',
                    salary: 30
                }
            }
        })
        
        // 修改name属性
        obj.value.name = '李四' //
        obj.value.job.detail.title = 'python开发' 
        // tips: 可能有人觉得,obj.value.xxx 不如 obj.xxx 直接来的直观,但是 ref 定义数据响应式就是有这么一个特点。
        
        return {
            num, // 在模板中,使用num,不需要加.value
            obj
        }   
    }
}

// ref 函数内部逻辑
// 1. 如果你传递的参数是基本数据类型,那么内部直接使用Object.defineProperty来定义一个新属性叫.value来实现响应式。
// 2. 如果你传递的是一个对象数据类型,那么内部使用 new Proxy 来定义数据的响应式。
// 所以,对于ref来说,内部选择使用 Object.defineProperty 还是 new Proxy 取决于你传递进来的数据.
// 大概逻辑如下.
function ref (value) {
    return new RefImpl(value)
}

function RefImpl (value) {
    this.__v_Ref = true
    this.__rawValue = value
    this.__newValue = value
    // this.__shallowRef = fasle
    if (typeof value !== 'object') {
        Object.define(this,'value', {
            get () {
                return this.__newValue
            },
            set (newVal) {
                this.__newValue = newVal
            }
        })
    } else {
        this.value = new Proxy (this,{
            get (target,propertyName) {
                return Reflect.get(target,propertyName)
            },
             set (target,propertyName,value) {
                Reflect.set(target,proeprtyName,value)
             },
            deleteProperty (target,propertyName) {
                //...监听delete属性操作...
                Reflect.delete(target,propertyName)
            },
        })
    }
}

如果你给 ref 传递的是基本数据类型,那么 .value 拿到的就是由 Object.defineProperty定义的那个 .value 属性。

如果你给 ref 传递的是对象数据类型,那么 .value 拿到的就是有 new Proxy 定义的那个对象。

五、 vue3.0 中的 reactive 函数

在ref函数介绍里,我们有这么一段代码

let obj = ref({
    name: '张三-老工具人了',
    job: {
        detail: {
            title: '前端开发',
            salary: 30
        }
    }
})
obj.value.name = '李四' //
obj.value.job.detail.title = 'python开发' 
// 可能有人觉得,obj.value.xxx 不如 obj.xxx 直接来的直观,但是 ref 定义数据响应式就是有这么一个特点。

可能有人觉得,obj.value.xxx 不如 obj.xxx 直接来的直观,但是 ref 定义数据响应式就是有这么一个特点。

所以,使用 ref 定义对象类型数据,并不是很好的方式。

于是就有了 reactive 函数。

import { reactive } from 'vue'
export default {
    name:'App',
    setup () {
        let person = reactive({
             name: '张三-老工具人了',
            job: {
                    detail: {
                        title: '前端开发',
                        salary: 30
                    }
                }
        })
        
        /// 访问数据
        console.log(person.name)
        // 修改属性
        person.job.detail.title = 'python开发' // 就没有烦人的.value了。
        
        return {
            person
        }
    }
    
}

所以,对于对象数据类型,使用 reactive 比 ref 更为合适。

建议: 基本数据类型,使用 ref, 对象类型使用 reactive

注意:不要给基本数据类型使用reactive做响应式,否则被报错

let num = reactive(0)

value cannot be made reactive: 0

总结ref和reactive

  • ref 可以定义基本数据类型响应式,也可以定义对象类型数据响应式
    • 当你给 ref 传递基本数据类型时,其内部的.value是使用的Object.defineProperty来实现响应式。
    • 当给你ref传递对象类型数据是,其内部的.value是使用的 new Proxy 来实现响应式。
    • 使用 ref 定义响应式,想访问到真实的数据,必须加一个 .value
  • reactive 只能定义对象类型数据响应式

持续更新中......

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容