until封装watch常用逻辑简化代码写法

我来详细讲解一下“until封装watch常用逻辑简化代码写法”的攻略。

什么是until

untilVue.js中一个常用的指令修饰符,它用于监听数据变化直到满足条件才执行操作。常用语法如下:

<!-- 监听value值变化,直到其等于一个值为9的时候才执行alert方法 -->
<div v-on:click="alert('clicked')" v-on:click.until="value === 9">{{ value }}</div>

watch的常用逻辑

Vue.js中的watch是非常常用的一种数据监听方式,通过监听指定数据的变化来触发特定的逻辑。常见的有以下几种:

对象监听

watch: {
  'person.name': function (newName, oldName) {
    console.log(`姓名从 ${oldName} 改为了 ${newName}`);
  }
}

数组监听

watch: {
  'list': function (newList, oldList) {
    console.log(`列表从 ${oldList} 改为了 ${newList}`);
  }
}

immediate

watch: {
  'person.name': {
    immediate: true,
    handler (newName, oldName) {
      console.log(`姓名从 ${oldName} 改为了 ${newName}`);
    }
  }
}

until封装watch常用逻辑

使用until指令可以简化watch中的常用逻辑代码。我们可以将unil封装进去,使watch的逻辑更加清晰简洁。封装方法如下:

Vue.directive('until', {
  bind (el, binding, vnode) {
    const { expression, value } = binding
    const newValue = typeof value === 'function' ? value() : value
    let isReady = false

    function watchHandler (newVal, oldVal) {
      if (isReady) return
      if (!expression) {
        isReady = true
        vnode.context.$forceUpdate()
        return newValue
      }

      const [left, right] = expression.split('==')
      const leftValue = vnode.context(left.trim())
      const rightValue = Number(right.trim())
      if (leftValue === rightValue) {
        isReady = true
        vnode.context.$forceUpdate()
        return newValue
      }
    }

    vnode.context.$watch(expression, watchHandler)
  }
})

现在我们可以使用until简化watch中的常用逻辑,示例如下:

watch: {
  'person.name': {
    until: 'age == 18',
    handler (newName, oldName) {
      console.log(`姓名从 ${oldName} 改为了 ${newName}`);
    }
  }
}

上述代码中,handler函数只有在age等于18时才会被触发。另外,我们还可以像之前那样,使用function方式指定一个具体的值,用于提高代码的可维护性和阅读性。

示例1

现在我们有一个需求,就是监听vm.person.namevm.person.age的变化,只有当name'小明'age18的时候才触发回调函数,否则不做任何操作。

使用until封装的代码如下:

Vue.directive('until', {
  bind (el, binding, vnode) {
    const { expression, value } = binding
    const newValue = typeof value === 'function' ? value() : value
    let isReady = false

    function watchHandler (newVal, oldVal) {
      if (isReady) return
      if (!expression) {
        isReady = true
        vnode.context.$forceUpdate()
        return newValue
      }

      const [left, right] = expression.split('==')
      const leftValue = vnode.context(left.trim())
      const rightValue = Number(right.trim())
      if (leftValue === rightValue) {
        isReady = true
        vnode.context.$forceUpdate()
        return newValue
      }
    }

    vnode.context.$watch(expression, watchHandler)
  }
})

var vm = new Vue({
  el: '#app',
  data: {
    person: {
      name: '',
      age: null
    }
  },
  watch: {
    'person.name': {
      until: "person.name == '小明' && person.age == 18",
      handler (newName, oldName) {
        console.log(`姓名从 ${oldName} 改为了 ${newName}`);
      }
    },
    'person.age': {
      until: "person.name == '小明' && person.age == 18",
      handler (newAge, oldAge) {
        console.log(`年龄从 ${oldAge} 改为了 ${newAge}`);
      }
    }
  }
})

示例2

假设我们有一个需求,我们需要监听数据变化,当数据变化的时候,会发起一个请求。这个请求是需要缓冲的,也就是说,如果100ms内又有数据变化,那么上一次的请求就会被覆盖,只保留最后一次的变化触发的请求。如何实现这个需求呢?

我们使用until封装watch的代码可以实现这个需求:

Vue.directive('until', {
  bind (el, binding, vnode) {
    const { expression, value } = binding
    const newValue = typeof value === 'function' ? value() : value
    let isReady = false

    function watchHandler (newVal, oldVal) {
      if (!expression) {
        vnode.context.$forceUpdate()
        return newValue
      }

      const [left, right] = expression.split('==')
      const leftValue = vnode.context(left.trim())
      const rightValue = Number(right.trim())
      if (leftValue === rightValue) {
        isReady = true
        setTimeout(() => {
          vnode.context.$forceUpdate()
          isReady = false
        }, 100)
        return newValue
      }
    }

    vnode.context.$watch(expression, watchHandler)
  }
})


var vm = new Vue({
  el: '#app',
  data: {
    list: []
  },
  watch: {
    'list': {
      until: "true",
      handler (newList, oldList) {
        console.log('数据发生了变化,并发起了请求');
      }
    }
  }
})

在这个示例中,我们将until指令的条件设为true,这样就会直接触发回调函数。如果在100ms内有数据变化,那么会将100ms缓冲时间重置,重新计时。这样,就能实现100ms内只能发起一次请求的效果了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:until封装watch常用逻辑简化代码写法 - Python技术站

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

相关文章

  • vue3中调用api接口实现数据的渲染以及详情方式

    当我们在Vue 3中进行开发时,我们通常需要与后端API进行数据交互。这里提供一个完整的攻略,帮助开发者学习如何在Vue 3中调用API接口实现数据的渲染以及详情方式。 步骤一:安装和引入axios Axios是一个流行的网络请求库,我们可以通过npm命令来安装: npm install axios 在Vue 3中,我们通常通过在main.js中全局引入ax…

    Vue 2023年5月28日
    00
  • Vue实现数字时钟效果

    下面是Vue实现数字时钟效果的完整攻略: 创建Vue项目 首先,我们需要创建一个Vue项目来实现我们的数字时钟效果。我们可以使用vue-cli快速创建一个项目,在命令行中输入: vue create vue-clock 这将会创建一个名为vue-clock的Vue项目。接着,进入项目目录并运行如下命令: cd vue-clock npm run serve …

    Vue 2023年5月29日
    00
  • vue2.0开发实践总结之疑难篇

    Vue2.0开发实践总结之疑难篇攻略 在Vue2.0开发实践中,我们经常会遇到一些疑难问题。本攻略主要介绍Vue2.0开发中的一些常见疑难问题及其解决方法。 1. Vue组件中引入CSS文件 使用Vue开发时,可以使用<style>标签将样式写在组件内部,但是当我们需要引入外部的CSS文件时应该怎么办?我们可以使用@import或<link…

    Vue 2023年5月28日
    00
  • 面试最常问的13种Vue修饰符

    Vue修饰符是Vue提供的一组用于监听DOM事件、操作DOM的一些特殊语法。在Vue面试中,Vue修饰符是一个经常被问到的知识点。下面是关于“面试最常问的13种Vue修饰符”的完整攻略: 1. .prevent 修饰符 使用 .prevent 修饰符可以阻止元素默认事件的触发。例如,在form表单中,当用户点击提交按钮时,页面会自动刷新。我们可以使用 .pr…

    Vue 2023年5月27日
    00
  • 精读《Vue3.0 Function API》

    精读《Vue3.0 Function API》攻略 什么是Vue3.0 Function API Vue3.0 Function API 是 Vue3.0 中新添加的一种 API 范式,它是建立在组合式 API 之上的,旨在提高我们在编写 Vue 应用时的代码 风格及组件复用率等方面的优化。 如何使用Vue3.0 Function API 安装 Vue3.0…

    Vue 2023年5月27日
    00
  • Java实现简易提款机

    我很乐意为您讲解Java实现简易提款机的攻略。 1. 需求分析 在开始编写代码之前,我们需要对我们的项目进行需求分析。根据题目要求,我们需要实现一个简易提款机,可以进行以下操作: 检查银行卡是否存在,并且余额是否足够提款 如果检查通过,则进行提款操作,并更新余额 如果检查未通过,则提示用户错误信息 2. 实现思路 基于上述要求,我们可以利用面向对象编程的思想…

    Vue 2023年5月28日
    00
  • Vue 页面状态保持页面间数据传输的一种方法(推荐)

    为了让大家更好的了解“Vue 页面状态保持页面间数据传输的一种方法(推荐)”,我会提供以下几个方面的攻略: Vue 组件间通信方式分析 Vue 组件间通信方式有多种,包括:props、$emit/$on、Vuex等。其中,props是父组件向子组件通信的方式,而$emit/$on是组件之间自下而上或自上而下进行的广播。 Vuex则是为了解决组件之间数据传递而…

    Vue 2023年5月28日
    00
  • 浅谈在Vue.js中如何实现时间转换指令

    怎样在Vue.js中定义自定义指令Vue.js框架中提供了一个全局指令注册方法Vue.directive,可以方便地添加自定义指令。指令本质上就是一个指令函数,有五个钩子函数,分别对应着不同的阶段。 如何实现时间转换指令在Vue.js中,可以采用过滤器方式来实现时间转换,也可以采用指令方式来实现。在本文中,我们主要介绍如何使用指令来实现时间转换功能。时间转换…

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