npm install -g @vue/clivue
vue create vue-next-testweb
目前建立 Vue 3.0 项目须要经过插件升级的方式来实现,
vue-cli 尚未直接支持,咱们进入项目目录,并输入如下指令:vuex
cd vue-next-test
vue add vue-nextvue-cli
- 默认进行懒观察(按需监听)
在 2.x 版本里,无论数据多大,都会在一开始就为其建立观察者。当数据很大时,这可能会在页面载入时形成明显的性能压力。3.x 版本,只会对「被用于渲染初始可见部分的数据」建立观察者,并且 3.x 的观察者更高效- 更精准的变动通知。
举例来讲:2.x 版本中,使用 Vue.set 来给对象新增一个属性时,这个对象的全部 watcher 都会从新运行;3.x 版本中,只有依赖那个属性的 watcher 才会从新运行- 3.0 新加入了 TypeScript 以及 PWA 的支持
4 .按需引入
Vue2.x中new出的实例对象,全部的东西都在这个vue对象上,这样其实不管你用到仍是没用到,都会跑一变。而vue3.0中能够用ES module imports按需引入,如:keep-alive内置组件、v-model指令,等等。
vue3.0中取消了 beforeCreate 和 created 两个周期,由于setup会在这个这个周期前执行,所以你能够在setup中进行你须要的处理。其余的生命周期所有以on开头。npm
import { onBeforeMount, onMounted, onBeforeUnmount, onBeforeUpdate, onDeactivated, onUnmounted, onUpdated } from '@vue/composition-api' export default { setup(){ onBeforeMount(() =>{ console.log('onBeforeMount'); }) onMounted(() =>{ console.log('onMounted'); }) onBeforeUnmount(() =>{ console.log('onBeforeUnmount'); }) onBeforeUpdate(() =>{ console.log('onBeforeUpdate'); }) onDeactivated(() =>{ console.log('onDeactivated'); }) onUnmounted(() =>{ console.log('onUnmounted'); }) onUpdated(() =>{ console.log('onUpdated'); }) } }
Vue 3.0 中定义状态的方法改成相似 React Hooks 的方法
Vue 3.0 中初始化状态经过 setup 方法,
定义状态须要调用 ref 方法。接下来咱们定义一个事件,用来更新 count 状态:api
<template> <div class="test"> <h1>test count: {{count}}</h1> <button @click="add">add</button> </div> </template> <script> import { ref } from 'vue' export default { setup () { const count = ref(0) const add = () => { count.value++ } return { count, add } } } </script>
count 值的时候不能直接使用 count++,而应使用 count.value++svg
<template> <div class="test"> <h1>test count: {{count}}</h1> <div>count * 2 = {{doubleCount}}</div> <button @click="add">add</button> </div> </template> <script> import { ref, computed, watch } from 'vue' export default { setup () { const count = ref(0) const add = () => { count.value++ } watch(() => count.value, val => { console.log(`count is ${val}`) }) const doubleCount = computed(() => count.value * 2) return { count, doubleCount, add } } } </script>
<script> import { getCurrentInstance } from 'vue' export default { setup () { const { ctx } = getCurrentInstance() console.log(ctx.$router.currentRoute.value) } } </script>
store/ index.js import Vuex from 'vuex' export default Vuex.createStore({ state: { test: { a: 1 } }, mutations: { setTest(state, val) { console.log(val); state.test.a = val } } }); // 调用 <template> <div class="test"> <h1>a: {{a}}</h1> <button @click="update">update vuex</button> </div> </template> <script> import { getCurrentInstance } from 'vue' export default { setup () { const { ctx } = getCurrentInstance() const a = computed(() => ctx.$store.state.test.a) const update = () => { ctx.$store.commit('setTest', count) } return { count, add, newCount, a, update } } } </script>
<template> <div class="test"> <h1>test count: {{count}}</h1> <button @click="addFn">add</button> <button @click="removeFn">remove</button> </div> </template> <script> import { ref, onBeforeMount } from 'vue' export default { setup () { const count = ref(0) const add = addFn(count) const remove = removeFn(count) return { ...add, ...remove, count } } } function addFn(count) { const addFn = () => { count.value ++ } return { addFn } } function removeFn(count) { const removeFn = () => { count.value -- } return { removeFn } } </script>