Vue中为什么data不是一个对象,而是一个函数?
当我们给data
定义为一个函数时,点击某一个按钮,就会操作对应的组件,而且数据之间不会有影响。
当返回的data
定义的是一个对象或者数组时,因为共用的是一个data
数据时,所以我们点击不同的组件时,会发现每一个组件都在改变,导致数据污染。所以data
是一个函数,因为每个data
可以进行独立维护。
代码实现如下:
<template>
<div>
<button @click="numList++">+</button>
<span>Count: {{ numList }}</span>
<button @click="numList--">-</button>
</div>
</template>
<script>
export default {
data(): {
return {
numList: 0
}
}
}
</script>
<style>
</style>
路由的懒加载
当我们使用下面这种方法实现路由懒加载,我们可以在路由中router
文件夹下面的index.js
文件用来存放路由, 我们可以直接引入路由,这样当我们打开项目后,控制台netWork
面板会加载app.js
文件,我们会发现这个文件较大,当我们切换路由到About.vue
路由时,发现没有加载js
文件,这是因为第一次进来时,已经将About.vue
的js
文件加载到app.js
。
代码实现如下:
import About from '../views/About.vue'
Vue.use(VueRouter)
const routes = [
{ path: '/about', name: 'About', component: About }
]
初次之外,我们还可以使用下面这种方式实现路由懒加载,当使用下面方法时,在路由懒加载时,我们进入页面控制台的network
面板查看app.js
,发现这个文件变小了,而且当我们切换到about
路由页面时,会加载对应的about.js
文件。路由懒加载只有当我们访问该路由的时候才会加载对应的js
文件。这样就可以缩短首屏渲染时间。其中webpackChunkName
是决定我们加载对应js
的文件名字是什么。我这里写的about
所以会加载出about.js
。如果不写的话,加载就显示0.js
文件。
代码实现如下:
Vue.use(VueRouter)
const routes = [
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */'../views/About.vue')
}
]
v-for和v-if不一起使用?
我们在vue2
中如果v-if
和 v-for
一起使用时,首先会执行v-for
,因为v-for
的优先级高,从而会造成性能的损耗。为了解决这种损耗,我们可以使用v-for
和v-if
的嵌套功能,这样vue
就会先判断v-if
再去执行循坏。
代码实现如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue2中v-for和v-if不能连用?</title>
</head>
<body>
<div id="app">
<!-- vue2中v-for会比v-if优先执行 -->
<div v-if="flag">
<div v-for="(item, index) in colors">
{{item}}
</div>
</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
colors: ['pink', 'black', 'yellow'],
flag: false
}
}
})
</script>
</body>
</html>
上面代码中如果flag
为false
的时候,就不会执行循环了。但是我们在控制台可以看到外面会多了一层div
标签,如果我们想要不多一层标签,可以将div
修改为template
标签就行。
注意:虽然vue3
中v-if
的优先级高于v-for
,但是我们依然不建议在同一个标签上使用,如果想要使用,还是使用嵌套的方法。