一、过滤器

过滤器分为局部过滤器和全局过滤器。

1.局部过滤器

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script>
  6. // 定义App
  7. let App = {
  8. data() {
  9. return {
  10. msg: 'Hello World'
  11. }
  12. },
  13. // 使用msg的时候,使用管道符号传递给filter进行处理
  14. template: `
  15. <div>
  16. <h2>{{ msg | myReverse }}</h2>
  17. </div>
  18. `,
  19. filters: {
  20. myReverse: function (val) {
  21. return val.split("").reverse().join("");
  22. }
  23. }
  24. }
  25. var vm = new Vue({
  26. el: "#app",
  27. data() {
  28. return {}
  29. },
  30. components: {
  31. App
  32. },
  33. template: `
  34. <div>
  35. <App></App>
  36. </div>
  37. `
  38. })
  39. </script>
  40. </body>

可以看到,过滤器使用filters属性来定义,可以定义多个过滤器。

在使用的时候,使用管道符号"|"将数据传递给过滤器进行处理。实质上就是一个处理函数。

2.全局过滤器

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script src="./static/moment.js"></script>
  6. <script>
  7. Vue.filter('myTime',function(val,formatStr){
  8. return moment(val).format(formatStr);
  9. })
  10. // 定义App
  11. let App = {
  12. data() {
  13. return {
  14. msg: new Date()
  15. }
  16. },
  17. // 使用msg的时候,使用管道符号传递给filter进行处理
  18. template: `
  19. <div>
  20. <h2>{{ msg | myTime("YYYY-MM-DD") }}</h2>
  21. </div>
  22. `
  23. }
  24. var vm = new Vue({
  25. el: "#app",
  26. data() {
  27. return {}
  28. },
  29. components: {
  30. App
  31. },
  32. template: `
  33. <div>
  34. <App></App>
  35. </div>
  36. `
  37. })
  38. </script>
  39. </body>

全局过滤器使用Vue.filter()来定义。和定义全局组件很像。

这里使用了一个moment.js库,这个库主要用来处理时间。可以学习一下。。。官方地址:http://momentjs.cn/

二、生命周期的钩子函数

vue实例的声明周期中有以下几个钩子函数:

参考:https://cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90

  • beforeCreate  创建实例之前(实际上是初始化实例之前,data中的属性还不存在)被调用
  • created  创建实例之后被调用
  • beforeMount  挂载之前(template中的元素渲染到页面之前)被调用
  • mounted  挂载之后(渲染到页面之后,可以获取真实DOM)被调用
  • beforeUpdate  修改template中调用的属性之前被调用
  • updated  修改template中调用的属性之后被调用
  • activated  配合<keep-alive>的组件被创建时调用
  • deactivated  配合<keep-alive>的组件被摧毁时调用
  • beforeDestroy  组件被摧毁之前调用
  • destroyed  组件被摧毁之后调用

用得最多的created、mounted、destroyed等。

1.beforeCreated和created

created钩子函数,我们在之间就已经使用过了,在其中使用ajax请求后台数据。

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script>
  6. // 定义App
  7. let App = {
  8. data() {
  9. return {
  10. msg:'我是App组件'
  11. }
  12. },
  13. template: `
  14. <div>
  15. <h2>{{ msg }}</h2>
  16. </div>
  17. `,
  18. // beforeCreate钩子函数,在实例创建之前执行
  19. beforeCreate(){
  20. console.log("beforeCreate:"+this.msg) // 这里打印undefined,因为实例创建之前,this都不存在,msg更不存在
  21. },
  22. // created钩子函数,在实例创建之后立即执行
  23. created(){
  24. console.log("created:"+this.msg) // 这里打印created:我是App组件
  25. }
  26. }
  27. var vm = new Vue({
  28. el: "#app",
  29. data() {
  30. return {}
  31. },
  32. components: {
  33. App
  34. },
  35. template: `
  36. <div>
  37. <App></App>
  38. </div>
  39. `
  40. })
  41. </script>
  42. </body>

beforeCreate是在App对象创建之前调用的,其中的this可以拿到对象(VueComponent对象),但是this.msg还不存在,所以this.msg为undefined。

created是在App对象创建之后调用,我们一般在其中请求后台数据(利用Ajax)。

执行结果:

2.beforeMount和mounted

mount是什么意思?create只是创建实例,但是template中的html标签还没有渲染到页面中。mounted就是已经渲染到页面上了(即html页面中已经存在组件中定义的标签)。

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script>
  6. // 定义App
  7. let App = {
  8. data() {
  9. return {
  10. msg:'我是App组件'
  11. }
  12. },
  13. template: `
  14. <div id="app_div">
  15. <h2>{{ msg }}</h2>
  16. </div>
  17. `,
  18. // 在挂载(渲染)之前执行,div还没有被渲染到页面中
  19. beforeMount(){
  20. console.log("beforeMounted:"+document.getElementById('app_div')); // 打印null
  21. },
  22. // 在挂载(渲染)之后执行,div已经被渲染到页面中了
  23. mounted(){
  24. console.log("mounted:"+document.getElementById('app_div')); // 打印object HTMLDivElement
  25. }
  26. }
  27. var vm = new Vue({
  28. el: "#app",
  29. data() {
  30. return {}
  31. },
  32. components: {
  33. App
  34. },
  35. template: `
  36. <div>
  37. <App></App>
  38. </div>
  39. `
  40. })
  41. </script>
  42. </body>

beforeMount钩子函数是在组件挂载之前(渲染之前)执行,从页面中还拿不到组件定义的template中的标签。

mounted钩子函数是在组件挂载之后(渲染之后)执行,从页面中可以拿到相应的标签对象。

执行结果:

3.deforeUpdate和updated

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script>
  6. // 定义App
  7. let App = {
  8. data() {
  9. return {
  10. msg:'我是App组件'
  11. }
  12. },
  13. template: `
  14. <div id="app_div">
  15. <h2 id="app_h2">{{msg}}</h2>
  16. <button @click="changeMsg">修改msg</button>
  17. </div>
  18. `,
  19. methods:{
  20. changeMsg(){
  21. this.msg = "我是修改后的App组件";
  22. }
  23. },
  24. // 在对template修改之前调用(必须是template中使用了的属性,未对template产生影响的属性被修改不会调用)
  25. beforeUpdate(){
  26. console.log("beforeUpdate:"+document.getElementById('app_h2').innerText);
  27. },
  28. // 在对template修改之后调用
  29. updated(){
  30. console.log("updated:"+document.getElementById('app_h2').innerText);
  31. }
  32. }
  33. var vm = new Vue({
  34. el: "#app",
  35. data() {
  36. return {}
  37. },
  38. components: {
  39. App
  40. },
  41. template: `
  42. <div>
  43. <App></App>
  44. </div>
  45. `
  46. })
  47. </script>
  48. </body>

beforeUpdate是在template被修改之前调用,updated是在template被修改之后调用。

template被修改的意思是:我们对某个属性进行修改,如果这个属性被template中的html调用了,则template就被修改了,否则template没发生改变的话,这两个钩子函数都不会被调用。

执行结果:

4.beforeDestroy和destroyed

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script>
  6. // 定义App
  7. let App = {
  8. data() {
  9. return {
  10. msg:'我是App组件',
  11. count:, // 保存定时器递增数
  12. timer:null //保存定时器
  13. }
  14. },
  15. template: `
  16. <div id="app_div">
  17. <h2 id="app_h2">{{msg}}</h2>
  18. <h2>{{count}}</h2>
  19. </div>
  20. `,
  21. created(){
  22. // 设置一个定时器,count每0.5s递增1,定时器赋值给timer
  23. this.timer = setInterval(()=>{
  24. this.count++;
  25. },);
  26. },
  27. // 在被销毁之前调用
  28. beforeDestroy(){
  29. console.log("beforeDestroy");
  30. },
  31. // 在被销毁之后调用,并清除定时器
  32. destroyed(){
  33. console.log("destroyed");
  34. clearInterval(this.timer);
  35. console.log("定时器已清除")
  36. }
  37. }
  38. var vm = new Vue({
  39. el: "#app",
  40. data() {
  41. return {
  42. is_exist:true
  43. }
  44. },
  45. components: {
  46. App
  47. },
  48. template: `
  49. <div>
  50. <App v-if="is_exist"></App>
  51. <button @click="destroyHandler">销毁App</button>
  52. </div>
  53. `,
  54. methods:{
  55. destroyHandler(){
  56. this.is_exist = !this.is_exist;
  57. }
  58. }
  59. })
  60. </script>
  61. </body>

beforeDestroy是在组件被销毁之前调用,destroyed是在组件被销毁之后调用。销毁组件使用v-if="isShow",改变isShow的值即可。

我们一般是在destroyed函数中做一些收尾工作,例如关闭定时器等。

执行效果:

4.activated和deactivated

当我们在一个页面中实现多个页签。例如:

当我们切换页签时,除了显示当前页面的元素,其他页签的元素应该是被摧毁的,这样才不会使浏览器渲染压力过重。

但是如果我们在某个页签中选中了一个元素(例如选中的元素有个特效边框,表示被选中),然后我们切换到其他页签,再切换回来,我们希望选中的元素还是被选中状态。这种情况下,只使用v-if来摧毁组件就不行了。

要想实现上面所述的场景,就要使用vue为我们提供的<keep-alive>来包裹我们想要缓存的元素状态:

  1. <body>
  2. <div id="app">
  3. </div>
  4. <script src="./static/vue.js"></script>
  5. <script>
  6. // 定义App
  7. let App = {
  8. data() {
  9. return {
  10. msg:'我是App组件',
  11. }
  12. },
  13. template: `
  14. <div id="app_div">
  15. <h2 id="app_h2">{{msg}}</h2>
  16. </div>
  17. `,
  18. //
  19. activated(){
  20. console.log("被激活了");
  21. },
  22. deactivated(){
  23. console.log("失效了");
  24. }
  25. }
  26. var vm = new Vue({
  27. el: "#app",
  28. data() {
  29. return {
  30. is_exist:true
  31. }
  32. },
  33. components: {
  34. App
  35. },
  36. // 使用<keep-alive>将需要缓存状态的组件包裹起来
  37. template: `
  38. <div>
  39. <keep-alive>
  40. <App v-if="is_exist"></App>
  41. </keep-alive>
  42. <button @click="selectApp">选中App</button>
  43. <button @click="destroyHandler">切换到其他页签</button>
  44. </div>
  45. `,
  46. methods:{
  47. // 选中组件(将其字体变红)
  48. selectApp(){
  49. document.querySelector('#app_div').style.color = 'red';
  50. },
  51. // 摧毁和重新生成组件
  52. destroyHandler(){
  53. this.is_exist = !this.is_exist;
  54. }
  55. }
  56. })
  57. </script>
  58. </body>

我们点击"选中App"按钮将字体染红,模拟被选中的元素。然后点击"切换到其他页签"按钮,将App组件摧毁。然后再次点击,重新生成App组件。

执行效果:

可以看到,我们摧毁App组件后,再次生成,状态还是红色。说明我们在摧毁之前,App组件的标签状态被vue缓存起来了。

三、生命周期图

第二节中已经详细说明了钩子函数的用法,我们可以通过官方提供的了生命周期图来帮助理解:

参考官方文档:https://cn.vuejs.org/v2/guide/instance.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%9B%BE%E7%A4%BA

66

[前端] VUE基础 (5) (过滤器、生命周期、钩子函数)的更多相关文章

  1. vue-cli脚手架 ,过滤器,生命周期钩子函数

    一.安装vue-cli脚手架 1.淘宝镜像下载 用淘宝的国内服务器来向国外的服务器请求,我们向淘宝请求,而不是由我们直接向国外的服务器请求,会大大提升请求速度,使用时,将所有的npm命令换成cnpm即 ...

  2. vue之生命周期钩子函数之运用

    一.什么是生命周期钩子函数: 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时在这个过程中也会运行 ...

  3. 关于 vue 生命周期 钩子函数 事件

    vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染->更新->渲染.卸载等一系列过程,我们称这是vue的生命周期. 通俗的将就是vue实例从创建到销毁 ...

  4. Vue生命周期 钩子函数和组件传值

    Vue生命周期 钩子函数 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. 同时在这个过程中也会运行一 ...

  5. 前端(二十)—— vue介绍:引用vue、vue实例、实例生命周期钩子

    vue 一.认识Vue 定义:一个构建数据驱动的 web 界面的渐进式框架 优点: 1.可以完全通过客户端浏览器渲染页面,服务器端只提供数据 2.方便构建单页面应用程序(SPA) 3.数据驱动 =&g ...

  6. 对vue生命周期/钩子函数的理解

    对于实现页面逻辑交互等效果,我们必须知晓vue的生命周期,才能愉快的玩耍,知道我们写的东西应该挂载到哪里,vue官方给出的api讲解的那叫一个简单啊,如下: 所有的生命周期钩子自动绑定this上下文到 ...

  7. Vue 实例中的生命周期钩子

    Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...

  8. vue生命周期 钩子函数

    首先,1.x和2.x的生命周期钩子对比: 钩子函数的树状图,红色的是我们可以利用的函数,绿色的是函数解析,蓝色的是函数执行时机 <!DOCTYPE html> <html> & ...

  9. Vue 2.0 生命周期-钩子函数理解

    Vue 2.0 + 生命周期钩子在项目过程中经常用到,所以闲下来整理了下,直接复制下面的实例运行: <!DOCTYPE html> <html lang="en" ...

  10. 详解Vue 实例中的生命周期钩子

    Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...

随机推荐

  1. ProxyPass与ProxyPassReverse及ProxyPassMatch的概述

    转载自:https://blog.csdn.net/xiaokui_wingfly/article/details/51481653 apache中的mod_proxy模块主要作用就是进行url的转发 ...

  2. GetqueueStatus

    #include "stdafx.h" #include <Windows.h> #include <process.h> #include <ios ...

  3. multi-layer perceptrons, MLP)模型,CvANN_MLP。

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ope ...

  4. 使用Spring Data Mongodb的MongoRepository类进行增删改查

    Spring Data Mongodb提供一套快捷操作 mongodb的方法,创建Dao,继承MongoRepository,并指定实体类型和主键类型. public interface CmsPag ...

  5. POJ 2039:To and Fro

    To and Fro Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8632   Accepted: 5797 Descri ...

  6. 十分简明易懂的FFT(快速傅里叶变换)

    https://blog.csdn.net/enjoy_pascal/article/details/81478582 FFT前言快速傅里叶变换 (fast Fourier transform),即利 ...

  7. python里的property修饰器

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  8. Codeforces Round #594 (Div. 1) Ivan the Fool and the Probability Theory

    题意:给你一个NxM的图,让你求有多少符合 “一个格子最多只有一个同颜色邻居”的图? 题解:首先我们可以分析一维,很容易就可以知道这是一个斐波那契计数 因为dp[1][m]可以是dp[1][m-1]添 ...

  9. H3C S10512虚拟化配置

    软件版本:Version 7.1.070, Release 7585P05 1.配置SW1#设置SW1的成员编号为1,创建IRF端口2,并将它与物理接口Ten-G0/0/45.Ten-G0/0/46. ...

  10. tensorflow 损失计算--MSN

    1.tf.losses.mean_squared_error函数 tf.losses.mean_squared_error( labels, predictions, weights=1.0, sco ...