在2020年9月中旬,vue.js发布了3.0正式版,在不久的将来,VUE3.0 也终将成为大前端的必然趋势,

环境搭建

  1. node 版本要求: Node.js8.9 或更高版本 ,输入 node -v 查看node版本

  2. vue-cli 版本:达到 vue-cli4.5.0 以上,可创建vue3.0的项目,支持体验vue3.0的新特性,(3.x Preview),vue -V 查看脚手架版本

  3. 终端输入: vue create project_name

核心知识

一 、组件的定义和使用

组件:是维护单一功能,可复用的单个个体,相同的样式及逻辑即可抽离成组件,方便维护,复用性增强。也是vue3.0项目中,最核心的概念

defineComponent:vue3.0中提供了一个函数返回传递给它的对象,最重要的是:在TypeScript下,给予了组件 正确的参数类型推断 。此处先不展开介绍,后续会总结 vue3.0 + ts。

setup:组件的启动函数,两个参数: props(父组件传递的数据)content ( 上下文对象),最后return 定义的数据,方法,钩子函数等,且setup中 没有this,不能访问this

<script>

    import { defineComponent } from 'vue'

    export default defineComponent ({
setup (props, content) {
// TODO 数据,方法,钩子函数等
return { }
}
}) </script>

二、数据的定义和使用

  1. ref定义单个数据,接受一个参数值并返回一个响应式且可改变的 ref 对象。ref 对象拥有一个指向内部值的单一属性 .value
import { ref } from 'vue'

export default {
setup () {
let num1 = ref(10) // Number
let name1 = ref('Echoyya') // String
let arr1 = ref(['a','d','c','d']) // Array
let obj1 = ref({age:20}) // Object // 获取及改变 ref对象的值,获取内部值的单一属性 value
console.log(num1.value) // 10 num1.value++
console.log(num1.value) // 11 return {
//使用 ref 定义的数据,需要直接 return
num1,name1,arr1,obj1
}
}
}
  1. reactive: 用于创建响应式数据,接收一个普通对象然后返回该普通对象的响应式代理,即双向数据绑定,

    • 使用 reactive 定义的数据,不需要逐一 return,可以使用 ES6 的扩展运算符。

    • 解构会破坏双向数据绑定的特性, 变更为单向数据绑定

    • 解决:vue3.0中添加了新特性,可对当前的数据进行转换。将其转换为响应式数据,toRefs将数据包裹即可转换为响应式数据

import { reactive, toRefs } from 'vue'

export default {
setup () {
let data = reactive ({
num:33,
arr:['a','d','c','d'],
obj:{age:20},
})
// 获取及改变:reactive 定义的数据,调用时直接 reactive变量名.数据名,
console.log(data.num) // 33 data.num++
console.log(data.num) // 34 return {
...toRefs(data)
}
}
}

三、方式的定义和使用

创建的方法仍然需要 return

<template>
<div>
<p><button @click="clickNum">{{num}}</button></p>
<p><button @click="clickNum1">{{num1}}</button></p>
<p><button @click="singleMethod">{{name}}</button></p>
</div>
</template> <script> import { reactive, ref, toRefs } from 'vue'
export default {
setup () {
let num1 = ref(10)
let name = ref('Echoyya')
let data = reactive({
num:33,
}) // 定义多个方法,不需要逐一 return
let methods = {
clickNum1: () => {
num1.value++
console.log(num1.value);
},
clickNum : () => {
data.num ++
console.log(data.num);
}
}
// 定义单个方法,需要return
let singleMethod = () => {
console.log(name.value)
}
return {
num1,
name,
singleMethod,
...toRefs(data)
...methods,
}
}
} </script>

四、路由的定义、使用和传参

  1. /src/router/index.js:在路由文件中使用了createRouter方法
import { createRouter } from 'vue-router'
const routes = [
{
path: '/',
name: 'Home',
component: () => import('../views/Home.vue')
},
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
}
]
const router = createRouter({
routes
}) export default router
  1. home组件中使用,路由跳转及传递参数
<template>
<div>
<p><button @click="gotoQuery">query跳转</button></p>
<p><button @click="gotoParams">params跳转</button></p>
</div>
</template> <script> import { useRouter } from 'vue-router'
export default {
setup (){
// router对象是全局路由的实例。
let router = useRouter() // 跳转路由用push: 跳转时可使用name 和 path,传递参数可使用query 和 params let gotoQuery = () => {
// query: 可以使用name和path,参数显示在地址栏中, 且页面刷新参数仍在
router.push({
// name:'About',
path:'/about',
query:{
name:'Echoyya',
age: 25,
obj:JSON.stringify({gender:"f"})
},
})
}
let gotoParams = () => {
// params:只能使用name ,不显示在地址栏中,且页面刷新,参数清空 console.log(route.params); 打印空对象
router.push({
name:'Home',
params:{
name:'Echoyya',
age: 25,
obj:JSON.stringify({gender:"f"})
}
})
} return {
gotoQuery,
gotoParams
}
}
}
  1. about组件中使用,接收路由参数
import { useRoute } from 'vue-router'
export default {
setup (){
// route对象表示当前的路由信息,包含了当前 URL 解析得到的信息。包含当前的路径,参数,query对象等。
let route = useRoute() console.log(typeof route.query.age) //string, query传递的参数都是string类型
console.log(route.query); //获取query传参
console.log(route.params); //获取params传参
return {}
}
}

五、父子组件传值

  1. 父 to 子:通过动态绑定属性的方式,子组件在props 中去接收,

  2. 子 to 父:通过ctx.emit('事件名称', 传递的参数)事件分发的方式, 父组件当中,调用子组件标签上绑定自定义事件,其中包含一个参数,即子组件传递过来的数据

    • ctx.emit('事件名称', 传递的参数)事件分发, ctx是 setup 函数的第二个参数,上下文对象

    • emit 只能接受两个参数,其余不生效,第一个参数:事件名称,第二个: 传递的数据

    • 事件分发,不一定要通过点击事件,也可使用钩子函数等

    • 需要传递多个参数时,emit第二个参数可选择数组或是对象

father.vue

<template>
<div class="wrapper">
<p>this is father components</p>
<p> 子组件传递的值:{{childMsg}}</p>
<!-- msg 自定义属性,send 自定义监听事件-->
<p><child :msg="msg" @send="getChildData"></child></p>
</div>
</template> <script>
import { ref } from 'vue'
import child from '../components/child'
export default {
components:{
child
},
setup() {
let msg = ref('father组件数据')
let childMsg = ref('')
let getChildData = (data)=>{
childMsg.value = data
}
return {
msg,
childMsg,
getChildData
}
},
}
</script>

child.vue

<template>
<div>
this is child components
<p>父组件传递过来的值:{{msg}}</p>
<p><button @click="send">传值给父组件</button></p>
</div>
</template> <script>
import {ref,onMounted, reactive} from 'vue'
export default {
name:'child',
// props 接收的数据,不能直接修改,如props.xxx = yy
props:{
msg:{
type:String , // 数据类型校验
require:true , // 是否必传 默认false
default:'默认值' // require和default 有些冲突,即必填时,可不设置默认值
}
},
setup(props,ctx){
console.log(props.msg); // 父组件传递的数据:father组件数据 let childMsg = ref('child组件数据')
let data = reactive({
childNum:10
}) let send = ()=>{
ctx.emit('send',childMsg.value)
// ctx.emit('send',[childMsg.value,data.childNum]) // 数组
// ctx.emit('send',{ // 对象
// msg:childMsg.value,
// num:data.childNum
})
}
return {
childMsg,
send,
...data
}
}
})
</script>

六、状态管理的定义和使用

状态管理即 VUEX,为达到数据共享的目的

  1. /src/store/index.js:在状态管理文件中使用了createStore方法
import { createStore } from 'vuex'

export default createStore({
// 定义所需要的状态
state: {
name: 'Echoyya',
}, // 同步修改state ,是方法,不能操作异步操作(包括发送请求及定时器等)
mutations: {
// 可接收两个参数:一:state,二:需修改的值,payload(可选)
setName(state, payload) {
state.name = payload
},
},
// 提交 mutations
actions: {
// 可接收两个参数 一:store, 二 要修改的值
asyncSetName(store, params) {
setTimeout(() => {
// commit 是提交mutation, 提交异步的mutations方法
store.commit('setName', params)
console.log(store.state.name)
}, 2000)
}
},
// 模块化
modules: {}
})
  1. 组件中调用,VUEX操作数据
<template>
<div>
{{name}}===={{name1}}===={{name2}}
<p><button @click="setName">设置 name</button></p>
<p><button @click="asyncSetName">异步设置 name</button></p>
</div>
</template> <script>
import { reactive, ref, toRefs, computed } from 'vue'
import { useStore } from 'vuex' export default {
setup (){
//通过 ref 方式
let name = ref(store.state.name) // 计算属性 方式
let name1 = computed(()=>{
return store.state.name + 'computed'
}) //reactive 方式
let data = reactive({
name2:store.state.name + '_reactive'
}) // 触发 mutations
let setName = ()=>{
console.log(store.state.name) // Echoyya
store.commit('setName','nhyya')
console.log(store.state.name) // nhyya
}
// 触发 action
let asyncSetName = ()=>{
store.dispatch('asyncSetName','nhyya1212')
}
return {
name,
name1,
...toRefs(data),
setName,
asyncSetName
}
}
})
</script>

七、常用的生命周期

  1. setup:不需要引入的生命周期 ,表示组件创建的过程,且没有this

  2. onMounted:比setup 稍微晚一些执行,表示组件挂载的过程,包括数据, dom元素等,是一个函数,需要传入一个回调函数执行,无参数。

    • 常用于:发送请求、数据初始化的操作、接受路由传递的参数
  3. onUnmounted:与 onMounted 相对应,组件卸载或销毁(路由跳转),常用于清除定时器等操作

较 VUE2.0 另有哪些改变?

  • 3.0去掉了filter, 没有beforeCreate created,用setup取代

  • setup里没有this

  • 3.0兼容IE12以上

  • 可直接监听数组类型的数据变化

  • 监听的目标为对象本身,不需要像Object.defineProperty一样遍历每个属性,有一定的性能提升

  • 直接实现对象属性的新增/删除

  • 重构 Virtual DOM:模板编译时的优化,将一些静态节点编译成常量

  • 另附上vue3.0 文档地址: https://v3.cn.vuejs.org/

上述内容并非全部 VUE3 内容,只是我通过一段时间的学习,做的自我总结,以便学习和复习,写的不准确之处还望大神们能留言指正

VUE 3.0 初体验之路的更多相关文章

  1. vue组件化初体验 全局组件和局部组件

    vue组件化初体验 全局组件和局部组件 vue组件化 全局组件 局部组件  关于vue入门案例请参阅 https://www.cnblogs.com/singledogpro/p/11938222.h ...

  2. MySQL8.0初体验

    MySQL8.0的官方社区开源版出来有段时间了,而percona的8.0版本还没有正式对外发布(已发布测试版),一直以来也没安装体验下这个号称质的飞跃的版本,今天正好有些时间就下了安装体验体验. 一. ...

  3. Vue3.0初体验

    最近看了Vue3.0的相关信息,相比Vue2.0有以下优点: Performance:性能更比Vue 2.0强. Tree shaking support:可以将无用模块"剪辑", ...

  4. vue-cli3.0 初体验

    vue-cli3.0 自我记录 其实在2018年8月10号,vue-cli3.0就已经面世了,由于项目中应用的全是2.x版本,所以并不了解3.0的vue-cli发生了什么变化,那今天尝试了下遇见的问题 ...

  5. 手动搭建webpack + vue项目之初体验

    在使用vue做开发时,大部分人只会使用官方提供的脚手架搭建项目,脚手架虽然很好用,但想要成为一名优秀的前端开发者,webpack这一道坎是绕不开的,所以我们要学会脱离脚手架,利用webpack手动搭建 ...

  6. (一) .net core 2.0 初体验

    1..net core 2.0环境 .net core 下载地址:https://www.microsoft.com/net/core#windowscmd 问题一:提示[Failed to load ...

  7. 【swoole2.0】 PHP + swoole2.0 初体验

    背景: centos7   PHP7.1   swoole2.0 准备工作: 一.  swoole  扩展安装 1 下载swoole cd /usr/local wget -c https://git ...

  8. TensorFlow2.0初体验

    TF2.0默认为动态图,即eager模式.意味着TF能像Pytorch一样不用在session中才能输出中间参数值了,那么动态图和静态图毕竟是有区别的,tf2.0也会有写法上的变化.不过值得吐槽的是, ...

  9. Vue Cli 3 初体验(全面详解)

    vue新出了 vue cli 3,并直接改名为 @vue/cli,今天就来盘他. 首先介绍等啰里啰嗦的就不写了,贴个link吧. Vue CLi3 github Vue CLi web 要是想先了解下 ...

随机推荐

  1. 【Docker】安装docker18.09.6后,无法启动

    ------------------------------------------------------------------------------------------------- | ...

  2. Eclipse中给jar包导入JavaDoc的方法

    原文转载自:http://blog.csdn.net/mr_von/article/details/7740138 在使用Java语言开发的过程中,开发人员经常需要用到一些开源的工具包.在使用别人的j ...

  3. [Usaco2005 Dec]Scales 天平

    题目描述 约翰有一架用来称牛的体重的天平.与之配套的是N(1≤N≤1000)个已知质量的砝码(所有砝码质量的数值都在31位二进制内).每次称牛时,他都把某头奶牛安置在天平的某一边,然后往天平另一边加砝 ...

  4. django ajax应用

    ajax: 什么是ajax,有什么作用: 以前我们在页面向后台提交数据的时候都是使用from表单,这样的提交会在提交的时候将整个页面全部刷新,如果你在填写表单的时候提交之后发现某个数据不对,但是你已提 ...

  5. 🙈 如何隐藏你的热更新 bundle 文件?

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦. 前段时间我们公司的一个大佬从一些渠道得知了一些小道消息,某国民级 APP 因为 Apple App Store ...

  6. notepad文件对比

    一/格式转换 我用的是json,就以这个为例吧: 打开软件--插件--插件管理 搜索着两个进行安装,自动重启打开 将文件的代码做好,选择语言--J--可以找到json 用刚安装的插件--json vi ...

  7. Service Mesh架构的持续演进 单体模块化 SOA 微服务 Service Mesh

    架构不止-严选Service Mesh架构的持续演进 网易严选 王育松 严选技术团队 2019-11-25 前言同严选的业务一样,在下层承载它的IT系统架构一样要生存.呼吸.增长和发展,否则过时的.僵 ...

  8. JetBrains(IEDA、CLion、Pycharm) 学生获得免费使用资格

    JetBrains针对学生推出了免费使用资格,但是很多同学却不知道或者说不知道怎样获得免费资格,只能千辛万苦的去寻找破解密钥,但现在JetBrains针对盗版的封锁越来越严密,很多密钥过一段时间就会失 ...

  9. CF1416D 做题心得

    CF1416D 做题心得 上次在某trick中提到了这个题,一开始觉得太毒瘤没有写,现在把它补上了. 感觉实现这个东西,比单纯收获一个trick,收获的东西多太多了. 主要思路 它的主要trick是& ...

  10. 深入浅出Java线程池:使用篇

    前言 很高兴遇见你~ 借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池.例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJa ...