手拉手带你开启Vue3世界的鬼斧神工
前言
2020注定是不平凡的一年,无论是疫情的横空出世,还是世界局势的激烈动荡,抑或是股市的跌宕起伏,我相信很多国人都会有一种庆幸我是中国人的深刻感悟。作为一名技术宅,除了疫情,更多的还是雨女无瓜,随着Vue3.0 Beta
的推出,大家都争先恐后的尝了鲜,笔者也不例外,经过一番研究,觉得Vue3
也的确存在它独特的魅力,也应该写一篇博客方便还没有体验的朋友能够快速对其有一个大体的认知。
开始
此文默认你已熟悉
Vue2.x
相关知识
环境搭建
相关库版本
Vue-Cli 4.x
Vue 3.0.0-beta.1
Vue-Router 4.0.0-alpha.7
具体步骤如下:
- 使用
VueCli
创建一个Vue
基础项目:vue create project
- 在项目中,执行升级命令:
vue add vue-next
项目目录结构如下:
进行完以上操作无误之后基本环境就已经搭建完毕。
配置路由
- 项目中执行
npm install vue-router@4.0.0-alpha.7 -S
按照一般规范,在src
目录下新建router
文件夹,并在router
文件夹中新建index.js
文件。
index.js内容:
import { createRouter, createWebHashHistory } from 'vue-router';
import Home from '../components/home'const routes = [{path: '/', redirect: '/home'},{path: '/home', component: Home}
]export default createRouter({history: createWebHashHistory(),routes
})复制代码
基本的路由配置没有太大改变,大多数情况下你只需要关注routes
中路由规则编写。接下来,我们需要在main.js
中接入router
。
main.js:
import { createApp } from 'vue';
import App from './App.vue'
import router from './router';const app = createApp(App);app.use(router);
app.mount('#app');复制代码
不同于我们之前采用new Vue()
创建实例的方式,Vue3
在这里进行了改变;不仅如此,我们不难发现,安装路由的方式也由之前的Vue.use(Router)
变成如上方式,同理对于Vuex
的接入也是大同小异,笔者这里就不过多赘述了。
App.js
<template><div id="app"><router-view></router-view></div>
</template>
复制代码
基础语法初探
setup
setup功能是新的组件选项,它充当在组件内部使用Composition API(新特性)的入口点;创建组件实例时,在初始道具解析后立即调用。在生命周期方面,它在beforeCreate挂接之前被调用。
一般来说,按照我们之前常规的写法,我们在对需要使用变量、计算属性的时候,我们会习惯性的写上:
home/index.vue
<template><div class='home'><div>{{count}}</div><div>{{foo}}</div></div>
</template><script>import { ref } from 'vue'export default {name: 'home',data() {return {count: 0}},computed: {foo() {return this.count + 1;}}
};
复制代码
两者是需要被分类到各自的对象中,在同等功能实现上来说,Vue3
的实现如下:
<template><div class='home'><div>{{count}}</div><div>{{foo}}</div></div>
</template><script>import { ref, computed } from 'vue'export default {name: 'home',setup(props, context) {const count = ref(0)const foo = computed(() => count.value + 1)return {count,foo}}
};
</script>复制代码
看到这种语法你是不是懵了,不用慌,这部分着重介绍
setup
这个入口函数,具体内部语法可以先不用在意,后面都会进行对应性一一讲解。
setup
接收两个重要参数:
- props:这个自然不用多提了,等同于
vue2
的props
,在这个地方我们需要注意的地方是,我们不能对这个参数进行解构,如果使用解构会使他失去响应性。例如下面代码就会让props
传过来的值失去响应性:
export default {props: {name: String},setup({ name }) {watchEffect(() => {console.log(`name is: ` + name) // 失去响应性!})}
}复制代码
- context:其实这个参数我们也是比较熟悉的,它提供了一个上下文对象,该对象公开了先前this在2.x API中公开的属性的选择性列表,它仅包含三个属性(
attrs
、slots
、emit
),举个栗子:
setup(props, context) {context.attrs // 2.x:this.attrscontext.slots // 2.x:this.slotscontext.emit // 2.x:this.emit
}复制代码
看完代码,我们基本可以理解为setup
函数就是我们整个组件各项逻辑关系以及操作的入口了,在Vue3
中,我们使用不同api
的方式都是采用导入的形式,这就相当于我们有了更大的操作空间,有了更大的自由性。
虽然说Vue3
向下兼容Vue2
,但是这里其实我们需要注意的是,我们应该尽量避免2.x和setup
函数的混用,这将会导致一些问题。
reactive
取得一个对象并返回原始对象的反应式代理。这等效于2.x的
Vue.observable()
。
对这个api
用法,笔者用代码讲解会比较好理解:
<template><div class='home'><div>{{name}}</div></div>
</template><script>import { reactive } from 'vue'export default {name: 'home',setup() {const obj = reactive({name: '流星啊'})obj.name = 'bilibili'; // 修改属性值return obj;}
};
</script>
复制代码
相信大家已经看出来端倪,没错,这个api
就是单纯的把一个对象变得可响应。
ref
接受一个内部值并返回一个反应性且可变的ref对象。ref对象具有.value指向内部值的单个属性。
在这里我估计有小伙伴就要问了,这不就是2.x里的ref吗,不不不,在3.x它跟那个种在标签上的
ref
没有半点关系,也和$refs
没有任何关系,对于新的类似于2.x的获取dom
的方式请看模板引用部分。
同样,举个栗子:
<template><div class='home'><div>{{count}}</div></div>
</template><script>import { ref } from 'vue'export default {name: 'home',setup() {const count = ref(0);count.value++; // 有疑问的往下看笔者介绍console.log(count.value);return {count};}
};
</script>
复制代码
这里也有一个注意点,你如果想要修改使用ref构造出来的变量,只能对xxx.value
进行修改,同理你想要在js
中访问它的值必须使用xxx.value
,直接对count进行赋值如count++
,这种写法会报错。
在这里估计又有小伙伴要问了,那为啥在template
模板中使用{{count}}
访问的时候不用加.value
,这里其实你在使用插值表达式的时候,它内部会自动展开,所以我们直接用就行了。
如果说我们把reactive
和ref
结合起来用会有怎样的奇淫巧计呢
手拉手带你开启Vue3世界的鬼斧神工相关推荐
- 我的世界服务器linux加mod,在Linux下搭建带MOD 我的世界(Minecraft)服务器
在Linux下搭建带MOD 我的世界(Minecraft)服务器 系统要求 官方服务器推荐配置要求如下: CPU:Intel Core-Based CPUs or AMD K8-Based CPUs ...
- 在Linux下搭建带MOD 我的世界(Minecraft)服务器
在Linux下搭建带MOD 我的世界(Minecraft)服务器 系统要求 官方服务器推荐配置要求如下: CPU:Intel Core-Based CPUs or AMD K8-Based CPUs ...
- 带你走进虚拟化世界之kvm(转载)
http://chuck.blog.51cto.com/10232880/1720953 带你走进虚拟化世界之kvm 2015-12-08 23:10:46 标签:云计算 虚拟化 kvm 原创作品,允 ...
- 一键开启次元世界,AI Studio应用中心上线啦!
随着AIGC热潮如火如荼的发展,人工智能在越来越多的内容创意领域创造了丰富的交互体验,例如写作.绘画.编曲.视频等都显现出愈发明显的价值,频频带来令人赞叹的作品. 不论是内容娱乐行业,亦或是工业制造等 ...
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu的Command)
Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu的Command) 目录 tkinter应用案例 1.添加菜单栏组件 2.tkinter应用案例:添 ...
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu/Menu的Command)
Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu/Menu的Command) 目录 tkinter应用案例 1.添加右键弹出菜单 2.点击一个按钮弹 ...
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Canvas)
Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Canvas) 导读 动态演示调用python库的tkinter带你进入GUI世界(Canvas) 目录 t ...
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Find/undo事件)
Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Find/undo事件) 导读 动态演示调用python库的tkinter带你进入GUI世界(Find/un ...
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(text.insert/link各种事件)
Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(text.insert/link各种事件) 导读 动态演示调用python库的tkinter带你进入GUI世 ...
最新文章
- vs2017 open从v_宣布#Open2017,这是面向开发人员的除夕直播流
- 请列举你了解的分布式锁_面试官想要你回答的分布式锁实现原理
- tensor torch 构造_详解Pytorch中的网络构造
- Eclipse 一直Building Workspace 的解决办法
- 安装和配置Hadoop
- 【问题收集·知识储备】Xcode只能选择My Mac,不能选择模拟器如何解决?
- 7-189 帅到没朋友 (20 分)
- Filebeat 采集多个文件到es
- git remote(远程仓库操作)
- 苹果谈iPhone遭CIA攻击:强烈要求用户升级系统
- ELK详解(六)——Logstash部署与简单应用
- Google Chrome Frame 谷歌浏览器框架
- 打印机怎么无线扫描到计算机,富士施乐打印机CM215fw无线扫描到电脑功能的使使用教程...
- 树莓派-13-红外遥控器HX1838
- 最小二乘法线性拟合介绍以及matlab实现
- Lucene.Net+盘古分词器(详细介绍)
- Win10 电脑磁盘分区
- PC - 电脑应该多久清洁一次?
- mysql:timestamp时间戳
- Ubuntu 10.04风扇声音太大