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日

相关文章

  • Vue实现textarea固定输入行数与添加下划线样式的思路详解

    首先我们要明确需求:实现一个文本框,在输入文字达到固定的行数后(比如说4行),禁止继续输入,同时在每一行末尾添加下划线样式。 思路概述 我们可以通过Vue指令的方式来实现这一需求。具体而言,我们需要通过以下步骤来实现: 监听文本框输入事件,当输入框的文字超过指定行数时禁止继续输入; 在每一行末尾添加下划线样式; 实现步骤 1. 监听输入事件 我们在Vue的d…

    Vue 2023年5月27日
    00
  • vue中如何使用embed标签PDF预览

    下面我来详细讲解“vue中如何使用embed标签PDF预览”的完整攻略。 一、前置条件 在使用embed标签预览PDF文件前,需要先安装Vue CLI工具,同时安装Vue PDF Viewer插件。 二、使用embed标签预览PDF文件的方法 以下是两种使用embed标签预览PDF文件的方法。 方法一:使用第三方组件库 Vue PDF Viewer是一个Vu…

    Vue 2023年5月28日
    00
  • Vue 2源码解读$mount函数原理

    下面就是“Vue 2源码解读$mount函数原理”的详细攻略。 什么是$mount函数 Vue 2中$mount函数是Vue实例的生命周期函数之一。当实例被创建之后,需要通过$mount方法将其挂载到某个元素上才能开始渲染。$mount函数会将模板编译为渲染函数,并且将渲染函数和虚拟DOM挂载到实例上。在挂载后,Vue实例就可以响应用户的交互事件,并且动态更…

    Vue 2023年5月27日
    00
  • vue parseHTML 函数源码解析AST基本形成

    下面是关于“vue parseHTML 函数源码解析AST基本形成”的完整攻略: 什么是parseHTML函数 parseHTML是Vue.js中的一个函数,主要用来将HTML字符串解析成AST对象。AST(Abstract Syntax Tree)是指抽象语法树,它是源代码的抽象语法结构的树状表现形式。Vue的模板就是由HTML模板和vue上下文中的数据组…

    Vue 2023年5月27日
    00
  • 浅谈Vue2.0中v-for迭代语法的变化(key、index)

    浅谈Vue2.0中v-for迭代语法的变化(key、index) 传统的v-for迭代语法 Vue 1.x和2.x在v-for指令上有一些差异,Vue 1.x中v-for迭代语法支持以下形式: <div v-for="item in items"> {{ item }} </div> 在Vue 1.x中,v-for…

    Vue 2023年5月28日
    00
  • vue项目中引入js-base64方式

    当我们在Vue项目中需要进行Base64编解码操作时,可以引入js-base64库来完成。下面将提供完整的引入方式以及两个示例说明: 1. 引入js-base64库 首先,我们需要安装js-base64库。在项目根目录下执行以下命令: npm install js-base64 –save 接着,在需要使用Base64的Vue组件或者JS文件中引入该库: …

    Vue 2023年5月28日
    00
  • 解读vue生成的文件目录结构及说明

    下面是详细讲解“解读vue生成的文件目录结构及说明”的完整攻略: 1. 前言 Vue.js 是当下前端开发中最热门的前端框架之一,它是一套构建用户界面的渐进式框架,易于上手、灵活性强、使用广泛。一个 Vue.js 项目的开发离不开以下文件目录结构: build config node_modules src static test 2. build目录 该目…

    Vue 2023年5月28日
    00
  • vue更新数据却不渲染页面的解决

    下面是关于Vue更新数据却不渲染页面的解决攻略的详细讲解。 问题背景 在Vue中,一般我们通过修改组件的数据来更新页面。但有时候在修改数据后,页面却没有自动更新,这可能会给我们带来很多困扰。这种情况在Vue中被称作“数据更新但是视图不更新”。 可能出现原因 造成“数据更新但是视图不更新”的原因主要有以下几种: Vue的异步更新机制:当我们修改Vue中的数据时…

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