# vue3
vue 3.0目前还在beta版本,他的仓库地址为vue-next (opens new window)。
要创建vue 3.0定制版本,之前需要vue-cli先创建vue 2.0然后再升级到vue 3.0。目前vue3.0 不支持typescript。
- 创建vue 2.0版本:
vue create datav-screen
- 升级到vue 3.0版本:
vue add vue-next
现在vue-cli可以直接创建vue 3.0定制版本了。
vue 3.0 相对于 vue 2.0的区别是:
- 更好地支持Tree-Shaking,引入的是vue中的某些东西,而不是整个vue实例。
- 使用插件不再是Vue.use,而是createApp。
# CompositionAPI
vue社区可以提RFC,在该仓库vuejs-rfcs (opens new window)。这里面很重要的一个特性是composition-api,官方专门提供了相应的文档Composition API (opens new window)
Composition API是一组低侵入式,函数式的API,使我们能够更灵活地组合组件的逻辑。低侵入式可以把一段代码抽离到一个单独模块中,不用与现在的代码耦合。
结合Composition API,vue的router和vuex同之前都不太一样:
store文件夹下的index.js文件内容为:
import { createStore } from 'vuex'
export default createStore({
state: {
number: 100,
},
mutations: {
SET_NUMBER(state, value) {
state.number = value
}
},
actions: {
setNumber({ commit }, value) {
commit('SET_NUMBER', value);
}
},
modules: {
a: {
state: {
aa: 11,
},
mutations: {
SET_AA(state, value) {
state.aa = value;
}
}
},
b: {
state: {
bb: 22,
},
mutations: {
SET_BB(state, value) {
state.bb = value;
}
}
},
},
getters: {
aaValue: (state) => state.a.aa,
bbValue: (state) => state.b.bb
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
useTest.js文件:
import { reactive, computed, watch, onMounted, ref, getCurrentInstance } from "vue";
export default function useTest() {
//类似react hooks中的 useState
const { ctx } = getCurrentInstance();
const state = reactive({ count: 1 });
const count2 = ref(3);
const increment = () => {
state.count++;
count2.value++
};
const gotoAbout = () => {
ctx.$router.push("/about")
}
const doubleCount = computed(() => state.count * 2);
const doubleCount2 = computed(() => count2.value * 3);
const number = computed(() => ctx.$store.state.number)
const updateNumber = () => {
//ctx.$store.commit('SET_NUMBER', count2.value * 100)
ctx.$store.dispatch('setNumber', count2.value * 100)
}
const aa = computed(() => ctx.$store.getters.aaValue);
const bb = computed(() => ctx.$store.getters.bbValue);
const updateAA = () => {
ctx.$store.commit('SET_AA', ctx.$store.state.a.aa + 1)
}
watch(() => state.count, () => {
console.log('state.count changed:' + state.count)
});
onMounted(() => {
console.log('onMounted...');
})
return {
state,
increment,
doubleCount,
doubleCount2,
gotoAbout,
number,
updateNumber,
aa,
bb,
updateAA,
};
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Test.vue文件内容为:
<template>
<button @click="increment">{{ state.count }}</button><br />
doubleCount: {{ doubleCount }} <br />
count2:{{ doubleCount2 }}<br />
<button @click="gotoAbout">跳转到about页面</button> <br />
vuex nubmer:{{ number }} <br />
<button @click="updateNumber">Update Number</button><br />
vuex a.aa:{{ aa }}<br />
<button @click="updateAA">Update AA</button><br />
vuex b.bb:{{ bb }}<br />
</template>
<script>
import useTest from "./useTest";
export default {
setup() {
return useTest();
},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20