vue 做为目前前端三大框架之一,对于前端开发者能够说是必备技能。那么怎么系统地学习和掌握 vue 呢?为此,我作了简单的知识体系体系总结,不足之处请各位大佬多多包涵和指正,若是喜欢的能够点个小赞!css
相关推荐html
优势:前端
缺点:不利于 SEO,社区维护力度不强,相比还不够成熟vue
v-html / v-text
:把值中的标签渲染出来v-model
: 放在表单元素上的,实现双向数据绑定v-bind
(缩写 :):用于绑定行内属性v-if / v-show
是否能显示,true 能显示,false 不能显示v-cloak
:须要配合 css 使用:解决小胡子显示问题v-once
对应的标签只渲染一次v-for
:循环显示元素v-on
事件绑定Vue.js
为 v-on
提供了事件修饰符,修饰符是由点开头的指令后缀来表示的。webpack
stop
:阻止事件继续传播prevent
:阻止事件默认行为capture
:添加事件监听器时使用事件捕获模式self
:当前元素触发时才触发事件处理函数once
:事件只触发一次passive
:告诉浏览器你不想阻止事件的默认行为,不能和.prevent 一块儿使用。<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="toDo"></a>
<!-- 提交事件再也不重载页面 -->
<form v-on:submit.prevent="toSubmit"></form>
<!-- 修饰符能够串联 -->
<a v-on:click.stop.prevent="toDo"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,而后才交由内部元素进行处理 -->
<div v-on:click.capture="toDo">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<div v-on:click.self="toDo">...</div>
<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="toDo"></a>
<!-- 滚动事件的默认行为 (即滚动行为) 将会当即触发 -->
<div v-on:scroll.passive="onScroll">...</div>
复制代码
过滤器是对即将显示的数据作进一步的筛选处理,而后进行显示,值得注意的是过滤器并无改变原来的数据,只是在原数据的基础上产生新的数据。nginx
Vue.filter('myFilter', function (value1[,value2,...] ) {
// 代码逻辑
})
复制代码
局部注册es6
new Vue({
filters: {
'myFilter': function (value1[,value2,...] ) {
// 代码逻辑
}
}
 })
复制代码
<!-- 在双花括号中 -->
<div>{{ message | myFilter }}</div>
<!-- 在 `v-bind` 中 -->
<div v-bind:id="message | myFilter"></div>
复制代码
依赖其它属性值,而且 computed
的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed
的值时才会从新计算 computed
的值;web
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
<script> var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 计算属性的 getter reversedMessage: function() { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } }) </script>
复制代码
观察和响应 Vue 实例上的数据变更。相似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操做。它能够有三个参数ajax
handler
:其值是一个回调函数。即监听到变化时应该执行的函数deep
:其值是 true 或 false;确认是否深刻监听。immediate
:其值是 true 或 false,确认是否以当前的初始值执行 handler 的函数watch:{
message:{
handler:function(val, oldVal){
console.log(val, oldVal)
},
deep: true,
immediate: true
}
}
复制代码
computed
: 是计算属性,依赖其它属性值,而且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会从新计算 computed 的值;watch
: 更多的是「观察」的做用,相似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操做。运用场景正则表达式
beforeCreate
(建立前) vue 实例的挂载元素$el 和数据对象 data 都是 undefined, 还未初始化created
(建立后) 完成了 data 数据初始化, el 还未初始化beforeMount
(载入前) vue 实例的$el 和 data 都初始化了, 相关的 render 函数首次被调用mounted
(载入后) 此过程当中进行 ajax 交互beforeUpdate
(更新前)updated
(更新后)beforeDestroy
(销毁前)destroyed
(销毁后)Vue 的父组件和子组件生命周期钩子执行顺序是什么?
组件(component)
是 Vue.js 最强大的功能之一。组件能够扩展 HTML 元素,封装可重用的代码。组件的使用过程包括定义和注册的过程。
// 方法一 Vue.extend
var MyComponent = Vue.extend({
template: '<div>A custom component!</div>'
})
// 方法二:新建一个.vue 文件
复制代码
// 全局注册
Vue.component('my-component', MyComponent)
// 局部注册
new Vue({
el: '#app',
components: {
'my-component': MyComponent
}
})
复制代码
<div id="example">
<my-component></my-component>
</div>
复制代码
props 值能够是一个数组或对象;
// 数组:不建议使用
props:[]
// 对象
props:{
inpVal:{
type:Number, //传入值限定类型
// type 值可为String,Number,Boolean,Array,Object,Date,Function,Symbol
// type 还能够是一个自定义的构造函数,而且经过 instanceof 来进行检查确认
required: true, //是否必传
default:200, //默认值,对象或数组默认值必须从一个工厂函数获取如 default:()=>[]
validator:(value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
复制代码
触发子组件触发父组件给本身绑定的事件,其实就是子传父的方法
// 父组件
<v-Header @title="title">
// 子组件
this.$emit('title',{title:'这是title'})
复制代码
state
:定义存贮数据的仓库 ,可经过 this.$store.state 或 mapState 访问getter
:获取 store 值,可认为是 store 的计算属性,可经过 this.$store.getter 或 mapGetters 访问mutation
:同步改变 store 值,可经过 mapMutations 调用action
:异步调用函数执行 mutation,进而改变 store 值,可经过 this.$dispatch 或 mapActions 访问modules
:模块,若是状态过多,能够拆分红模块,最后在入口经过...解构引入attrs
获取子传父中未在 props 定义的值
// 父组件
<home title="这是标题" width="80" height="80" imgUrl="imgUrl"/>
// 子组件
mounted() {
console.log(this.$attrs) //{title: "这是标题", width: "80", height: "80", imgUrl: "imgUrl"}
}
// 相对应的若是子组件定义了 props,打印的值就是剔除定义的属性
props: {
width: {
type: String,
default: ''
}
},
mounted() {
console.log(this.$attrs) //{title: "这是标题", height: "80", imgUrl: "imgUrl"}
}
复制代码
listeners
:场景:子组件须要调用父组件的方法。 解决:父组件的方法能够经过 v-on="listeners"
传入内部组件——在建立更高层次的组件时很是有用
// 父组件
<home @change="change"/>
// 子组件
mounted() {
console.log(this.$listeners) //便可拿到 change 事件
}
复制代码
provide
和 inject
主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中; 而且这对选项须要一块儿使用; 以容许一个祖先组件向其全部子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
//父组件:
provide: { //provide 是一个对象,提供一个属性或方法
foo: '这是 foo',
fooMethod:()=>{
console.log('父组件 fooMethod 被调用')
}
},
// 子或者孙子组件
inject: ['foo','fooMethod'], //数组或者对象,注入到子组件
mounted() {
this.fooMethod()
console.log(this.foo)
}
//在父组件下面全部的子组件均可以利用inject
复制代码
一般用于父组件调用子组件的方法
// 父组件
<home ref="child"/>
mounted(){
console.log(this.$refs.child) //便可拿到子组件的实例,就能够直接操做 data 和 methods
}
复制代码
// 在 main.js
Vue.prototype.$eventBus = new Vue()
// 传值组件
this.$eventBus.$emit('eventTarget', '这是eventTarget传过来的值')
// 接收组件
this.$eventBus.$on('eventTarget', v => {
console.log('eventTarget', v) //这是eventTarget传过来的值
})
复制代码
let routes = [
{
path: '/home',
component: home
},
{
path: '/list',
component: list
}
]
let router = new VueRouter({
routes: routes
})
let vm = new Vue({
el: '#app',
router
})
复制代码
在html使用
<div id="app">
<router-link to='/home' active-class='current'>首页</router-link>
<router-link to='/list' tag='div'>列表</router-link>
<router-view></router-view>
</div>
复制代码
此外,vue-router
还能够经过一下方式配置动态路由
query
传参(问号传参)params
传参(路径传参)Vue 项目中实现路由按需加载(路由懒加载)的 3 中方式:
// 一、Vue异步组件技术:
{
path: '/home',
name: 'Home',
component: resolve => reqire(['path路径'], resolve)
}
// 二、es6提案的import()
const Home = () => import('path路径')
// 三、webpack提供的require.ensure()
{
path: '/home',
name: 'Home',
component: r => require.ensure([],() => r(require('path路径')), 'demo')
}
复制代码
vue-router 提供的导航守卫主要用来经过跳转或取消的方式守卫导航。有多种机会植入路由导航过程当中:全局的, 单个路由独享的, 或者组件级的。
全局前置守卫 经常使用于判断登陆状态和菜单权限校验
router.beforeEach((to, from, next) => {
let isLogin = sessionStorage.getItem('isLogin') || ''
if (!isLogin && to.meta.auth) {
next('/login')
} else {
next()
}
})
复制代码
to
: Route: 即将要进入的目标 路由对象from
: Route: 当前导航正要离开的路由next
: Function: 必定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。组件内的守卫
beforeRouteEnter
beforeRouteUpdate
beforeRouteLeave
keep-alive
是 Vue 提供的一个抽象组件,用来对组件进行缓存,从而节省性能,因为是一个抽象组件,因此在 v 页面渲染完毕后不会被渲染成一个 DOM 元素。
<keep-alive>
<router-view></router-view>
</keep-alive>
复制代码
当组件在 keep-alive
内被切换时组件的 activated
、deactivated
这两个生命周期钩子函数会被执行
<keep-alive include="a,b">
<router-view></router-view>
</keep-alive>
<keep-alive exclude="c">
<router-view></router-view>
</keep-alive>
复制代码
include
属性表示只有 name 属性为 a,b 的组件会被缓存,(注意是组件的名字,不是路由的名字)其它组件不会被缓存。 exclude
属性表示除了 name 属性为 c 的组件不会被缓存,其它组件都会被缓存。
须要在 router 中设置 router 的元信息 meta
export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: Hello,
meta: {
keepAlive: false // 不须要缓存
}
},
{
path: '/page1',
name: 'Page1',
component: Page1,
meta: {
keepAlive: true // 须要被缓存
}
}
]
})
复制代码
在 app.vue 进行区别缓存和不用缓存的页面
<div id="app">
<router-view v-if="!$route.meta.keepAlive"></router-view>
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
</div>
复制代码
hash 模式:在浏览器中符号“#”,#以及#后面的字符称之为 hash,用 window.location.hash
读取。特色:hash 虽然在 URL 中,但不被包括在 HTTP 请求中;用来指导浏览器动做,对服务端安全无用,hash 不会重加载页面。
history 模式:history 采用 HTML5 的新特性;且提供了两个新方法: pushState(), replaceState()
能够对浏览器历史记录栈进行修改,以及popState
事件的监听到状态变动。
hash 模式中( http://localhost:8080#home)
,即便不须要配置,静态服务器始终会去寻找index.html
并返回给咱们,而后vue-router
会获取 #后面的字符做为参数,对前端页面进行变换。
history 模式中,咱们所想要的状况就是:输入http://localhost:8080/home
,但最终返回的也是index.html
,而后vue-router
会获取 home 做为参数,对前端页面进行变换。那么在nginx
中,谁能作到这件事呢?答案就是try_files
。
关注的个人公众号不按期分享前端知识,与您一块儿进步!