vue 做为目前前端三大框架之一,对于前端开发者能够说是必备技能。那么怎么系统地学习和掌握 vue 呢?为此,我作了简单的知识体系体系总结,不足之处请各位大佬多多包涵和指正,若是喜欢的能够点个小赞!本文源自个人掘金:https://juejin.im/post/5e5c5d...css
相关推荐html
JS基础总结(1)——数据类型
JS基础总结(2)——原型与原型链
JS基础总结(3)——做用域和闭包
JS基础总结(4)——this指向及call/apply/bind
JS基础总结(5)—— JS执行机制与EventLoopd前端
优势:vue
缺点:不利于 SEO,社区维护力度不强,相比还不够成熟webpack
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
提供了事件修饰符,修饰符是由点开头的指令后缀来表示的。nginx
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>
过滤器是对即将显示的数据作进一步的筛选处理,而后进行显示,值得注意的是过滤器并无改变原来的数据,只是在原数据的基础上产生新的数据。es6
Vue.filter('myFilter', function (value1[,value2,...] ) { // 代码逻辑 })
局部注册web
new Vue({ filters: { 'myFilter': function (value1[,value2,...] ) { // 代码逻辑 } } })
<!-- 在双花括号中 --> <div>{{ message | myFilter }}</div> <!-- 在 `v-bind` 中 --> <div v-bind:id="message | myFilter"></div>
依赖其它属性值,而且 computed
的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed
的值时才会从新计算 computed
的值;ajax
<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 实例上的数据变更。相似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操做。它能够有三个参数正则表达式
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>
window.location.hash
读取。特色:hash 虽然在 URL 中,但不被包括在 HTTP 请求中;用来指导浏览器动做,对服务端安全无用,hash 不会重加载页面。pushState(), replaceState()
能够对浏览器历史记录栈进行修改,以及popState
事件的监听到状态变动。( http://localhost:8080#home)
,即便不须要配置,静态服务器始终会去寻找index.html
并返回给咱们,而后vue-router
会获取 #后面的字符做为参数,对前端页面进行变换。http://localhost:8080/home
,但最终返回的也是index.html
,而后vue-router
会获取 home 做为参数,对前端页面进行变换。那么在nginx
中,谁能作到这件事呢?答案就是try_files
。从零开始构建一个webpack项目
总结几个webpack打包优化的方法
总结前端性能优化的方法
几种常见的JS递归算法
搭建一个vue-cli的移动端H5开发模板
封装一个toast和dialog组件并发布到npm
一文读尽前端路由、后端路由、单页面应用、多页面应用
浅谈JavaScript的防抖与节流
关注的个人公众号不按期分享前端知识,与您一块儿进步!