在平时的开发中,咱们用vue可能好久了,可是对于有的新特性或者技巧没有发现,本文就带着你们一块儿看看经常使用的vue技巧javascript
随着组件的细化,就会遇到多组件状态共享的状况,Vuex固然能够解决这类问题,不过就像Vuex官方文档所说的,若是应用不够大,为避免代码繁琐冗余,最好不要使用它,今天咱们介绍的是vue.js 2.6新增长的Observable API ,经过使用这个api咱们能够应对一些简单的跨组件数据状态共享的状况。css
以下这个例子,咱们将在组件外建立一个store,而后在App.vue组件里面使用store.js提供的store和mutation方法,同理其它组件也能够这样使用,从而实现多个组件共享数据状态。html
首先建立一个store.js,包含一个store和一个mutations,分别用来指向数据和处理方法。vue
import Vue from "vue";
export const store = Vue.observable({ count: 0 });
export const mutations = {
setCount(count) {
store.count = count;
}
};
复制代码
而后在App.vue里面引入这个store.js,在组件里面使用引入的数据和方法java
咱们应该都知道vue会经过object.defineProperty对数据进行劫持,来实现视图响应数据的变化,然而有些时候咱们的组件就是纯粹的数据展现,不会有任何改变,咱们就不须要vue来劫持咱们的数据,在大量数据展现的状况下,这可以很明显的减小组件初始化的时间,那如何禁止vue劫持咱们的数据呢?能够经过object.freeze方法来冻结一个对象,一旦被冻结的对象就不再能被修改了react
export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
}
};
复制代码
另外须要说明的是,这里只是冻结了users的值,引用不会被冻结,当咱们须要reactive数据的时候,咱们能够从新给users赋值。webpack
export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
},
methods:{
// 改变值不会触发视图响应this.data.users[0] = newValue
// 改变引用依然会触发视图响应this.data.users = newArray
}
};
复制代码
随着项目愈来愈大,书写的不注意,不天然的就会产生一些多余的css,小项目还好,一旦项目大了之后,多余的css会愈来愈多,致使包愈来愈大,从而影响项目运行性能,因此有必要在正式环境去除掉这些多余的css,这里推荐一个库purgecss,支持CLI、JavascriptApi、Webpack等多种方式使用,经过这个库,咱们能够很容易的去除掉多余的css。ios
npm i glob-all purify-css purifycss-webpack --save-dev
const PurifyCSS = require('purifycss-webpack')
const glob = require('glob-all')
plugins:[
// 清除无用 css
new PurifyCSS({
paths: glob.sync([
// 要作 CSS Tree Shaking 的路径文件
path.resolve(__dirname, './src/*.html'), // 请注意,咱们一样须要对 html 文件进行 tree shaking
path.resolve(__dirname, './src/*.js')
])
})
]
复制代码
函数式组件,即无状态,没法实例化,内部没有任何生命周期处理方法,很是轻量,于是渲染性能高,特别适合用来只依赖外部数据传递而变化的组件。git
写法以下:github
在template标签里面标明functional 只接受props值 不须要script标签
<!-- App.vue -->
<template> <div id="app"> <List :items="['Wonderwoman', 'Ironman']" :item-click="item => (clicked = item)" /> <p>Clicked hero: {{ clicked }}</p> </div> </template> <script> import List from "./List"; exportdefault { name: "App", data: () => ({ clicked: "" }), components: { List } }; </script> <!-- List.vue 函数式组件 --> <template functional> <div> <p v-for="item in props.items" @click="props.itemClick(item);"> {{ item }} </p></div> </template> 复制代码
好比有父组件Parent和子组件Child,若是父组件监听到子组件挂载mounted就作一些逻辑处理,常规的写法可能以下:
// Parent.vue
<Child @mounted="doSomething"/>
// Child.vue
mounted() {
this.$emit("mounted");
}
复制代码
这里提供一种特别简单的方式,子组件不须要任何处理,只须要在父组件引用的时候经过@hook来监听便可,代码重写以下:
<Child @hook:mounted="doSomething"/>
<Child @hook:updated="doSomething"/> 复制代码
固然这里不只仅是能够监听mounted,其它的生命周期事件,例如:created,updated等均可以,是否是特别方便~
再好比平时的绑定卸载事件:
window.addEventListener('resize',this.handleResize)
this.$on('hook:destroyed',() => {
window.removeventListener('resize',this.handleResize)
})
复制代码
更多有关hooks用法(useMounted,useComputed)可查看vue-hook源码
当 watch 一个变量的时候,初始化时并不会执行,以下面的例子,你须要在created的时候手动调用一次。
created() {
this.fetchUserList();
},
watch: {
searchText: 'fetchUserList',
}
复制代码
上面这样的作法可使用,但很麻烦,咱们能够添加immediate属性,这样初始化的时候就会自动触发(不用再写created去调用了),而后上面的代码就能简化为:
watch: {
searchText: {
handler: 'fetchUserList',
immediate: true
}
}
复制代码
以上就是经常使用的Vue开发技巧了,但愿能帮到你们