多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Vue进阶培训 <br> ## 1 培训简介 ### 1.1 内容 本次培训会介绍到一些Vue中更复杂一点的知识点,并且会以实际工程中的使用作为参考讲解。 ### 1.2 目标 认真学完之后,大家将会对Vue中的进阶知识有所了解。 <br><br> ## 2 模板语法进阶 ### 2.1 输入修饰符 .lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。 你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步: .number 如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符。 .trim 如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符 ### 2.2 混入 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。 ```js // 定义一个混入对象 var myMixin = { created: function () { this.hello() }, methods: { hello: function () { console.log('hello from mixin!') } } } // 定义一个使用混入对象的组件 var Component = Vue.extend({ mixins: [myMixin] }) var component = new Component() // => "hello from mixin!" ``` 一般都采用混入文件的方式来混入 注意 ① 数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。 ② 生命周期函数混入文件优先。 ### 2.3 自定义指令和自定义过滤器 2.3.1 自定义指令 当页面加载时,该元素将获得焦点,现在让我们用指令来实现这个功能: 全局自定义指令 ```js Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } }) ``` 如果想注册局部指令,组件中也接受一个 directives 的选项: ```js directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } } ``` 使用: ```js <input v-focus> ``` 2.3.1 自定义过滤器 Vue允许自定义过滤器,可被用于一些常见的文本格式化。 全局定义过滤器: ```js Vue.filter('capitalize', function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) }) ``` 如果想注册局部指令,组件中也接受一个 filters 的选项: ```js filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } ``` 使用: ```js {{ message | capitalize }} ``` <br><br> ## 3 组件使用进阶 ### 3.1 插槽 3.1.1 普通插槽 ```js <slot></slot> ``` 3.1.2 具名插槽 ```js <slot name="container"></slot> <template v-slot:container> <p>A paragraph for the main content.</p> <p>And another one.</p> </template> ``` 注:一般v-slot 只能添加在 `<template>` 上 3.1.3 作用域插槽 ```js <slot v-bind:user="user"></slot> <template v-slot:default="slotProps"> {{ slotProps.user.firstName }} </template> ``` ### 3.2 动态组件 在不同组件之间进行动态切换 ```js <component v-bind:is="currentTabComponent"></component> ``` ### 3.3 异步组件 Vue 允许以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。 ```js Vue.component('async-example', function (resolve, reject) { setTimeout(function () { // 向 `resolve` 回调传递组件定义 resolve({ template: '<div>I am async!</div>' }) }, 1000) }) ``` <br><br> ## 4 API使用进阶 ### 4.1 vm.$nextTick( [callback] ) 将回调延迟到下次 DOM 更新循环之后执行。 ```js new Vue({ // ... methods: { // ... example: function () { // 修改数据 this.message = 'changed' // DOM 还没有更新 this.$nextTick(function () { // DOM 现在更新了 // `this` 绑定到当前实例 this.doSomethingElse() }) } } }) ``` ### 4.2 vm.$refs 一个对象,持有注册过 ref 特性 的所有 DOM 元素和组件实例,用起来有点像id。 ```js // 组件或dom元素上添加ref属性 <base-input ref="usernameInput"></base-input> // js代码中用$refs获取 this.$refs.usernameInput ``` ### 4.3 vm.$set( target, propertyName/index, value ) 向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。 ```js export default { data() { return { obj: {} } }, mounted() { this.$set(this.obj, 'age', 10); } } ``` <br><br> ## 5 工具使用进阶 ### 5.1 vue-router 可以简单了解一下,因为我们的业务需求所以大部分工程都是多页面应用。 Vue Router 是 Vue.js 官方的路由管理器。针对于SPA(single page application):单一页面应用程序,它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。单页面应用(SPA)的核心之一是:更新视图而不重新请求页面;vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式。 hash模式 通过 hash 来实现路由 history模式 通过HTML5中的pushState 和 replaceState来实现,需要后端配合 ### 5.2 axios Axios 是一个基于 promise 的 HTTP 库 执行 GET 请求 ```js // 为给定 ID 的 user 创建请求 axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); // 可选地,上面的请求可以这样做 axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); ``` 执行 POST 请求 ```js axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); ``` 执行多个并发请求 ```js function getUserAccount() { return axios.get('/user/12345'); } function getUserPermissions() { return axios.get('/user/12345/permissions'); } axios.all([getUserAccount(), getUserPermissions()]) .then(axios.spread(function (acct, perms) { // 两个请求现在都执行完成 })); ``` <br><br> ## 6 另外还有vuex,jsx,vue-hooks等,大家可以接着探索。