Vue.js中的计算属性、监视属性与生命周期详解

Vue.js中的计算属性、监视属性与生命周期详解

计算属性

什么是计算属性

计算属性(computed)是Vue.js内置的一个特殊属性,可以定义一个依赖其它属性的计算属性,而这个计算属性的值会被缓存起来,在某些需要频繁用到的属性计算中,计算属性会比直接通过方法计算效率更高,因为计算属性是有缓存的,只有在它的相关属性发生改变时才会重新计算,否则直接取缓存值。

计算属性的使用方法

计算属性的基本语法如下:

computed: {
  计算属性名: function() {
    // 计算逻辑
    return 计算结果
  }
}

举个例子,我们定义一个data属性a和一个计算属性b,b的取值依赖于a,那么我们可以这样写:

<div id="app">
  <p>data属性a的值为:{{ a }}</p>
  <p>计算属性b的值为:{{ b }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    a: 1
  },
  computed: {
    b: function () {
      return this.a + 1
    }
  }
})

在此例子中,a的值为1,因此b的值就是a+1,所以b的值为2。

如果我们继续修改a的值,b的值会自动更新。例如我们执行下面的代码:

vm.a = 2
console.log(vm.b) // 输出 3

此时b的值就从之前的2变成了3。

计算属性示例

假设我们有一个商品列表列表,每个商品有价格和数量两个属性,那么一个计算属性可以计算出当前购物车的总价:

<div id="app">
  <ul>
    <li v-for="item in cart">
      {{ item.name }} - {{ item.price }}元 x {{ item.count }}个 = {{ item.totalPrice }}元
    </li>
  </ul>
  <p>总价:{{ totalPrice }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    cart: [
      { id: 1, name: '商品1', price: 10, count: 3 },
      { id: 2, name: '商品2', price: 20, count: 2 },
      { id: 3, name: '商品3', price: 30, count: 1 }
    ]
  },
  computed: {
    totalPrice: function() {
      var total = 0
      for (var i = 0; i < this.cart.length; i++) {
        var item = this.cart[i]
        total += item.price * item.count
      }
      return total
    }
  }
})

在计算属性totalPrice中,我们循环遍历购物车中的每个商品,累加它们的总价,最后返回总价。在模板中使用该计算属性,便可以直接显示购物车的总价。

监视属性

什么是监视属性

监视属性(watcher)是Vue.js中的另一个重要特性,可用于监听某个属性的变化,当属性发生变化时,可以执行一段自定义的代码逻辑,例如发送一次Ajax请求、更新一次DOM、再次执行计算属性等。

监视属性的使用方法

watch属性的基本语法如下:

watch: {
  监视属性名: function (newVal, oldVal) {
    // 变化逻辑
  }
}

举个例子,假设我们有两个属性a和b,当a的值发生变化时,我们需要将b的值更新为a的两倍,我们可以这样写:

<div id="app">
  <p>a的值是:{{ a }}</p>
  <p>b的值是:{{ b }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    a: 1,
    b: 2
  },
  watch: {
    a: function (newVal, oldVal) {
      this.b = newVal * 2
    }
  }
})

在此例子中,当我们修改a的值,b的值会自动更新为a的两倍。

监视属性示例

假设我们要监听一个输入框的变化,每当用户输入完毕并离开输入框时,我们需要发送一次Ajax请求,获取用户输入的关键词所匹配的结果:

<div id="app">
  <input v-model="keyword" @blur="search">
  <ul>
    <li v-for="(item, index) in searchResult" :key="index">{{ item }}</li>
  </ul>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    keyword: '',
    searchResult: []
  },
  methods: {
    search: _.debounce(function () {
      // 发送Ajax请求
      var that = this
      axios.get('/api/search', {
        params: {
          keyword: that.keyword
        }
      })
      .then(function (response) {
        that.searchResult = response.data
      })
      .catch(function (error) {
        console.log(error)
      })
    }, 500)
  }
})

在此例子中,我们在输入框上监听了blur事件,当用户离开输入框时,会自动触发search方法,发送Ajax请求,并将结果保存到searchResult中,最终在模板中显示出搜索结果。

生命周期

什么是生命周期

生命周期(lifecycle)是Vue.js中的另一个重要概念,它描述了Vue.js实例从创建、运行到销毁期间经历的状态变化,以及在每个状态变化时自动执行的函数。

生命周期的阶段

Vue.js实例经历了以下生命周期阶段:

  1. 创建阶段:beforeCreate、created;
  2. 挂载阶段:beforeMount、mounted;
  3. 更新阶段:beforeUpdate、updated;
  4. 销毁阶段:beforeDestroy、destroyed。

在每个阶段,Vue.js都会自动触发一些固定名称的函数,开发者可以利用这些生命周期钩子函数在不同阶段执行一些自定义的代码。

生命周期示例

假设我们开发了一个弹出对话框的组件,当需要弹出对话框时,我们需要先将对话框组件动态创建并挂载到页面中,待用户关闭对话框后,我们又需要销毁它。生命周期函数可以帮助我们完成这个任务。

<div id="app">
  <button @click="showDialog">显示对话框</button>
  <modal v-if="show" @close="closeDialog"></modal>
</div>
Vue.component('modal', {
  template: `
    <div class="modal">
      <div class="modal-mask"></div>
      <div class="modal-wrapper">
        <div class="modal-container">
          <div class="modal-header">
            <h3 class="modal-title"><slot name="header"></slot></h3>
            <button class="modal-close" @click="$emit('close')">×</button>
          </div>
          <div class="modal-body"><slot></slot></div>
        </div>
      </div>
    </div>
  `,
  mounted: function () {
    document.body.appendChild(this.$el)
  },
  beforeDestroy: function () {
    this.$el.parentNode.removeChild(this.$el)
  }
})

var vm = new Vue({
  el: '#app',
  data: {
    show: false
  },
  methods: {
    showDialog: function () {
      this.show = true
    },
    closeDialog: function () {
      this.show = false
    }
  }
})

在此例子中,我们定义了一个modal组件,并在其中的mounted函数中将组件的DOM元素动态挂载到body元素中。然后在组件被销毁前,我们又在组件的beforeDestroy函数中,将其DOM元素从body元素中移除。

在Vue.js实例中,我们定义了show属性,表示对话框是否显示,在关闭对话框时,我们将show属性设置为false,从而销毁对话框组件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js中的计算属性、监视属性与生命周期详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue 使用lodash实现对象数组深拷贝操作

    将 Vue 中的对象和数组进行深拷贝操作通常需要使用第三方库来进行操作。Lodash 是一个支持多种操作的 JavaScript 实用工具库,其中就包含了深拷贝操作。下面就是关于在 Vue 中使用 Lodash 实现对象数组深拷贝的详细攻略。 步骤一:安装 Lodash 从 Lodash 的官网上可以下载到 Lodash 的压缩包,也可以直接使用 npm 进…

    Vue 2023年5月29日
    00
  • Vue3+TS+Vite+NaiveUI搭建一个项目骨架实现

    下面我来详细讲解“Vue3+TS+Vite+NaiveUI搭建一个项目骨架实现”的完整攻略。 准备工作 在开始搭建项目骨架之前,我们需要先完成一些准备工作: 确认已安装 Node.js 安装 Vue CLI 4 或更高版本:npm install -g @vue/cli 创建项目:vue create my-project 安装 Vite Vite 是一个新…

    Vue 2023年5月27日
    00
  • Vue开发工具之vuejs-devtools安装教程及常见问题解决(最详细)

    下面我会详细讲解vuejs-devtools的安装教程及常见问题解决。 什么是Vue.js-devtools Vue.js-devtools是一款为Vue开发者提供的浏览器插件工具,安装后可以帮助开发者调试Vue应用程序并快速定位问题。它可以让你追踪你的Vue实例并且检查组件层次结构、轻松调试样式和查看组件props、data的值等。 安装Vue.js-de…

    Vue 2023年5月27日
    00
  • vue使用iframe嵌入网页的示例代码

    下面我会给出一个使用Vue实现在页面中嵌入iframe的完整攻略。具体步骤如下: 1.在 Vue 项目中安装 iframe-resizer 库。 npm install iframe-resizer –save 2.在需要嵌入 iframe 的组件中,引用 iframe-resizer 库。 import iframeResizer from ‘ifram…

    Vue 2023年5月28日
    00
  • vue项目的html如何引进public里面的js文件

    在Vue项目中,我们可以将静态资源(例如图片、样式表、JavaScript文件等)放在public文件夹中,然后在HTML中通过引入该文件夹中的文件来使用它们。以下是引入public文件夹中JavaScript文件的详细步骤: 1.将需要引入的JavaScript文件放在public文件夹中(例如,创建一个名为script.js的文件)。 2.在HTML模板…

    Vue 2023年5月28日
    00
  • vue fetch中的.then()的正确使用方法

    首先,对于Vue fetch中的.then()方法,我们需要了解一下Promise的基本概念。Promise是JavaScript异步编程的一种解决方案,在Vue fetch中使用.then()方法,就是在Promise中实现了异步操作。 .then()方法可以接受两个回调函数参数,当异步操作成功后会调用第一个回调函数,如果异步操作失败则会调用第二个回调函数…

    Vue 2023年5月27日
    00
  • 如何基于Vue制作一个猜拳小游戏

    下面是基于Vue制作一个猜拳小游戏的完整攻略。 确定游戏规则 在开始制作小游戏之前,我们需要确定游戏规则。假设游戏规则如下: 双方玩家进行猜拳,猜拳的结果有石头、剪刀、布三种情况。 石头胜剪刀,剪刀胜布,布胜石头。 双方猜拳结果相同,平局。 玩家可以选择猜拳次数。 创建Vue应用 首先,我们需要创建一个Vue应用。我们可以使用Vue CLI来快速创建一个基本…

    Vue 2023年5月27日
    00
  • Vue3.2 中新出的Expose用法一览

    Vue3.2 中出现了一个新特性 Expose,这个特性可以让我们更方便地将组件的内部逻辑和对外的数据或方法隔离开来。下面我将提供关于如何使用此特性的完整攻略。 Expose 是什么 在 Vue3.0 中,如果我们想将一些只有内部逻辑使用的方法暴露给组件的使用者使用,我们可以将它们放在 methods 选项中。然后在组件中使用 this.$emit() 的方…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部