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

yizhihongxing

我来详细讲解一下“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日

相关文章

  • vue-cli3添加模式配置多环境变量的方法

    介绍:vue-cli 3 是 Vue 官方提供的脚手架工具,使用 vue-cli3 可以快速搭建 Vue 项目,添加模式配置多环境变量,常用于项目的部署环境切换、前后端资源访问地址等的切换。本篇攻略介绍 vue-cli3 添加模式配置多环境变量的方法,包括两种示例说明。 准备工作 在使用 vue-cli3 添加模式配置多环境变量之前我们需要准备以下环境和工具…

    Vue 2023年5月28日
    00
  • Vue render深入开发讲解

    下面我将详细介绍“Vue render深入开发讲解”的完整攻略。 什么是Vue的render函数? Vue的render函数是用于构建虚拟DOM的函数。它接收一个createElement函数作为参数,然后利用这个函数构建一个虚拟DOM并返回。这个虚拟DOM会作为Vue的模板编译结果,最终渲染到页面上。 render函数的基本用法 render函数的基本用法…

    Vue 2023年5月28日
    00
  • Vue状态机的开启与停止操作详细讲解

    Vue状态机的开启与停止操作详细讲解 Vue状态机是实现应用程序状态管理的一种常见方式。它是一个基于Vue框架的库,可以帮助你在Vue应用程序中轻松管理状态的变化。在Vue中,状态机通常是一个基于RxJS或其他数据流程库的事件流,它们被用于自动更新视图和状态。 开始状态机 要开始状态机,您需要在Vue应用程序中引入状态机库。通常,您可以通过npm包管理器安装…

    Vue 2023年5月27日
    00
  • vue中的循环遍历对象、数组和字符串

    下面是关于vue中循环遍历对象、数组和字符串的详细攻略。 对象循环遍历 在vue中循环遍历对象可以使用v-for指令,与循环遍历数组类似。下面是一个简单的例子: <ul> <li v-for="(value, key) in obj">{{ key }}: {{ value }}</li> </u…

    Vue 2023年5月27日
    00
  • 基于Vue实现支持按周切换的日历

    实现支持按周切换的日历,需要借助Vue.js框架及其丰富的生态工具。本攻略将分为以下几个步骤进行讲解: 初始化Vue项目 安装所需依赖 编写日历组件 实现按周切换功能 下面我们一步一步进行详细的讲解。 1. 初始化Vue项目 在实现日历组件之前,需要先安装Vue并初始化项目。具体步骤如下: # 安装Vue脚手架 npm install -g @vue/cli…

    Vue 2023年5月29日
    00
  • vue devserver及其配置方法

    Vue DevServer的介绍和配置方法 什么是Vue DevServer? Vue DevServer是Vue CLI中一个用于调试Vue应用的开发服务器,它可以在本地开启一个服务器运行Vue应用,并提供实时重载(live reloading)、热替换(hot reloading)等等开发者常用的功能,以提高开发效率。 如何配置Vue DevServer…

    Vue 2023年5月27日
    00
  • JS实现将对象转化为数组的方法分析

    JS实现将对象转化为数组的方法分析 在JS中,有时候我们需要将对象转化为数组,以方便对其进行处理。下面介绍三种实现方法: Object.keys()、Object.values()和Object.entries()。 Object.keys() Object.keys(obj)可以将对象中的键(key)提取出来,返回一个由键组成的数组。该方法的语法如下: O…

    Vue 2023年5月28日
    00
  • vue实现动态给data函数中的属性赋值

    要实现动态地给Vue的data函数中的属性赋值,可以使用Vue.set()方法或this.$set()方法。这两个方法的作用是一样的,都可以在不直接修改对象的情况下更新响应式数据。 具体方法如下: 使用Vue.set() Vue.set()方法接收三个参数,分别是需要更新的对象、需要更新的属性名以及属性值。 例如,假设data函数返回的对象如下: data(…

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