此章主要记录一些 Vue 项目所涉及到的一些简单问题
query && params
当向详情页面跳转时候难免会通过路由像后台传递一个参数。传参分为query
传参和params
+动态路由传参两种,所以我们一起来看看二者区别:
query
通过path
切换路由。而params
则通过name
切换路由1
2
3
4// query通过path切换路由
<router-link :to="{path: 'Detail', query: { id: 1 }}">前往Detail页面</router-link>
// params通过name切换路由
<router-link :to="{name: 'Detail', params: { id: 1 }}">前往Detail页面</router-link>
query
通过this.$route.query
来接收参数,而params
则通过this.$route.params
来接收参数1
2
3
4
5
6
7
8
9// query通过this.$route.query接收参数
created () {
const id = this.$route.query.id;
}
// params通过this.$route.params来接收参数
created () {
const id = this.$route.params.id;
}
query
传参的 URL 更像是通过 GET 方式向后台发送数据(/detail?id=1&user=123&identity=1
),而params
则更加美观一点(/detail/123
)params
动态路由传参必须要在路由中定义参数,然后在路由跳转的时候必须要加上参数,否则就是空白页面。1
2
3
4
5
6
7<router-link :to="{name: 'Detail', params: { id: 1}">详情</router-link>
{
path: '/detail/:id',
name: 'Detail',
component: Detail
},
动态添加数据
由于框架限制,只有data
中的数据才是响应式的,而我们动态添加进来的数据默认均为非响应式。
我们一般通过以下两种方式实现动态添加数据的响应式
Vue.set(object, key, value)
:适用于添加单个属性Object.assign()
:适用于添加多个属性
1 | var vm = new Vue({ |
以此方式我们可以强行把新加入的数据绑定在发布者-订阅者模式之中
异步 DOM 更新
Vue 异步执行 DOM 更新,监视所有数据改变,一次性更新 DOM。其优势在于避免重复操作 DOM。
但若我们需要用到更新后 DOM 中的数据,则需要通过 Vue.nextTick(callback)
来进行调用
1 | methods: { |
这个在实践中的例子就是编写手机端的一个软件时点击跳转路由却总是获取当前的路由,最后通过高人指点才通过this.$nextTick
操作完成了加载
1 | this.$nextTick(()=>{ |
性能提升
v-pre
Vue 会跳过这个元素和其子元素的编译过程。可以用来显示原始Mustache
标签。跳过大量没有指令的节点会加快编译
1 | <span v-pre>{{ this will not be compiled }}</span> |
v-once
Vue 只渲染该元素和组件一次,随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过
1 | <span v-once>This will never change: {{msg}}</span> |
过滤器
这东西用于文本数据格式化,可以用在双括号和v-bind
表达式上
全局过滤器
全局过滤器我们一般用于过滤一些比较常用的数据,最经典的一个例子就是时间。我们一般将全局过滤器定义在main.js
中
1 | <div>{{ dateStr | date }}</div> |
项目中的一个例子就是利用插件将时间格式转码后显示
1 | import Moment from 'moment' |
这样我们就可以在全局任意一个地方使用注册的全局过滤器了
局部过滤器
只在所定义的实例之中起作用
1 | { |
事件修饰符
我们可以通过一些事件修饰符来节省大量逻辑代码
.stop
.prevent
.capture
.self
.once
.passive
1 | <!-- 阻止单击事件继续传播 --> |
watch、computed & method
method
method
就是普通意义的function
区域。在其中定义我们可能会使用到的方法
computed
具有缓存性,页面重新渲染值不变化,计算属性会立即返回之前的计算结果,不会重复计算
1 | el: '#app', |
赖收集、动态计算的流程:
1
2
3
4
5
6 > 1. data 属性初始化 getter setter
> 2. computed 计算属性初始化,提供的函数将用作属性 vm.reversedMessage 的 getter
> 3. 当首次获取 reversedMessage 计算属性的值时,Dep 开始依赖收集
> 4. 在执行 message getter 方法时,如果 Dep 处于依赖收集状态,则判定 message 为 reversedMessage 的依赖,并建立依赖关系
> 5. 当 message 发生变化时,根据依赖关系,触发 reverseMessage 的重新计算
>
watch
watch
是 Vue 所提供的更通用的,用以观察相应实例数据变动的方式。其键是要观察的表达式,值是对应的回调函数。
可以理解为:观察一个动作。
不具有缓存性。页面重新渲染时值不变化亦会重新计算
通常其作用computed
就可以完成,并且还省性能
1 | new Vue({ |
axios中的拦截器
拦截器会拦截发送的每一个请求。请求发送之前执行request
的函数,请求发送之后执行response
中的函数
1 | // 请求拦截器 |
非父子组建通讯
时间总线
简单的场景下可以用一个空的 Vue 实例作为事件总线
1 | var bus = new Vue() |
获取组件/DOM
尽管 Vue 不推荐用户直接操作 DOM,但还是留下了相关的 API—— refs
1 | <div id="app"> |
后记
好啦暂时总结这么多,以后项目中出现新的风暴再补充8。