vue3(指vue-cli3)与vue2差异
- vue3
- 性能的提升
- 打包大小减小41%
- 初次渲染快55%,更新快了33%
- 内存使用减少54%
- Composition API
- 其他特性和新增加的内置组件
- 更好的 Typescript 支持
- 性能的提升
- vue2
- 随着功能的增长,复杂组件的代码变得越来越难以维护
- Mixin缺点
- 命名冲突
- 不清楚暴露出来变量的作用
- 重用到其它component经常会遇到问题
- Mixin缺点
- Vue2 对 Typescript 的支持不完善
创建项目,vue3比起vue2简单很多
- vue create xxx(项目名称) 或者vue ui
- 选择安装模式
- ts-sass自己安装过的模板
- default系统默认
- Manually select features自己选配置
- 注意的是
- 卸载 npm uninstall vue-cli -g
- npm install -g @vue/cli // 安装cli3.x
- 更新node到最新版本 npm install -g n(安装模块 这个模块是专门用来管理node.js版本的) n stable(sudo n stable) // 更新node版本
- 想了解more跳转
- 移动端vue3配置 <a href=”https://juejin.im/post/5cbf32bc6fb9a03236393379“ style=”color: blue;”>想了解more跳转
- vue create xxx(项目名称) 或者vue ui
- 随着功能的增长,复杂组件的代码变得越来越难以维护
1 | // vue.config.js的配置 |
* cd xxx(项目名称)
* yarn serve
vue开发技巧
- To Learn More
- 长列表性能优化
- vue会通过Object.defineProperty对数据进行劫持,来实现视图响应数据的变化,有些时候我们的组件就是纯粹的数据展示,不会有任何改变,就不需要vue来劫持我们的数据,在大量数据展示的情况下,能够很明显的减少组件初始化的时间,如何禁止vue劫持我们的数据呢?
可以通过object.freeze方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
}
};
// 冻结了users的值,引用不会被冻结,当需要reactive数据的时候,可以重新给users赋值
export default {
data: () => ({
users: []
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
},
methods:{
// 改变值不会触发视图响应
this.users[0] = newValue
// 改变引用依然会触发视图响应
this.users = newArray
}
};
- vue会通过Object.defineProperty对数据进行劫持,来实现视图响应数据的变化,有些时候我们的组件就是纯粹的数据展示,不会有任何改变,就不需要vue来劫持我们的数据,在大量数据展示的情况下,能够很明显的减少组件初始化的时间,如何禁止vue劫持我们的数据呢?
vue中8种组件的通信方式
- To Learn More
props/$emit
- 父组件通过props的方式向子组件传递数据,通过$emit子组件向父组件通信
props只可以从上一级组件传递到下一级组件(父子组件),即单向数据流。且props只读,不可被修改,所有修改都会失效并警告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// section父组件
<template>
<div class="section">
<com-article :articles="articleList"></com-article>
</div>
</template>
<script>
import comArticle from './test/article.vue'
export default {
name: 'Section',
components: {
comArticle
},
data () {
return {
articleList: ['活着', '生活是一种奢侈', '小王子']
}
}
}
</script>
// 子组件 article.vue
<template>
<div>
<span v-for="(item, index) in articles" :key="index">{{item}}</span>
</div>
</template>
<script>
export default {
props: ['articles'] // 获取父组件的数据
}
</script>
- 父组件通过props的方式向子组件传递数据,通过$emit子组件向父组件通信
子组件向父组件传值
- $emit绑定一个自定义事件,当指令执行时,就会将参数arg传递给父组件,父组件通过v-on监听并接收参数
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// 父组件中
<template>
<div class="section">
<com-article :articles="articleList" @onEmitIndex="onEmitIndex"></com-article>
<p>{{currentIndex}}</p>
</div>
</template>
<script>
import comArticle from './test/article.vue'
export default {
name: 'Section',
components: {
comArticle
},
data () {
return {
currentIndex: -1,
articleList: ['活着', '生活是一种奢侈', '小王子']
}
},
methods: {
// 监听子组件传递的参数
onEmitIndex (idx) {
this.currentIndex = idx;
}
}
}
</script>
<template>
<div>
<div v-for="(item, index) in articles" :key="index" @click="emitIndex(index)">{{item}}</div>
</div>
</template>
<script>
export default {
props: ['articles'],
methods: {
// 派发到父组件的事件
emitIndex(index) {
this.$emit('onEmitIndex', index)
}
}
}
</script>
- $emit绑定一个自定义事件,当指令执行时,就会将参数arg传递给父组件,父组件通过v-on监听并接收参数
$children/$parent
- 通过$children和$parent可以访问组件的实例,代表可以访问组件的所有方法和data
在#app上拿$parent得到的是new Vue()的实例,在这实例上再拿$parent得到的是undefined,而在最底层的子组件拿$children是个空数组。也要注意得到$parent和$children的值不一样,$children的值是数组,而$parent是个对象
- 通过$children和$parent可以访问组件的实例,代表可以访问组件的所有方法和data
- 父子组件之间的通信, 而使用props进行父子组件通信更加普遍; 二者皆不能用于非父子组件之间的通信。