【问题标题】:Composition API watch handler组合 API 监视处理程序
【发布时间】:2021-12-25 22:20:07
【问题描述】:

我该如何重构:

watch: {
    count: {
      handler (v) {
        if (v) this.intervalId = setInterval(() => { this.now++ }, 1000)
        else clearInterval(this.intervalId)
      },
      immediate: true
    }
  }

进入组合 API?



我尝试了类似的方法,但会引发错误:

watch(()=> {
      count.value,
      handler (value) {
      if (value)
        intervalId.value = setInterval(() => {
          now.value++;
        }, 1000);
      else clearInterval(intervalId.value);
      },
      immediate: true
      })

【问题讨论】:

  • 通过将watch 选项替换为watch 函数,并将其他选项替换为各自的合成函数。如果您对此有特定问题,请考虑更新问题。只是要求为您编写代码不是一个正确的 SO 问题(根本不是问题)。

标签: vue.js vuejs3


【解决方案1】:

您可以如下重构它。您可以将immediate 选项作为Vue 3 中的第三个参数传递给watch 方法

const app = Vue.createApp({
  setup() {
    const count = Vue.ref(0);
    const now = Vue.ref(0);
    const intervalId = Vue.ref(0);

    Vue.watch(count, (currentValue, oldValue) => {
      if (currentValue) intervalId.value = setInterval(() => now.value++, 1000);
    }, {
      immediate: true
    });
    
    Vue.onUnmounted(() => { clearInterval(intervalId.value) });

    return {
      count,
      now
    };
  }
}).mount('#app');
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
  {{ count }} - {{ now }}
  <button @click="count++">Increment</button>
  <button @click="count=0">reset</button>
</div>
参考:

P.S:您可以使用import {watch, ref, onUnmounted} from "vue" 使代码更干净。

【讨论】:

  • 谢谢。我没有在问题中提到它,但是在手表之后提到了“clearInterval”为onUnmounted(() =&gt; { clearInterval(intervalId); });,那么我该如何正确称呼它呢? (对不起,一团糟)
  • 等一下,让我更新我的答案。
  • 哈哈当然,谢谢!
  • 更新了我的答案以包含 onUnmounted 钩子。
  • 嗯显然现在缺少else 正在停止功能.. 我想我仍然需要从其他内部调用clearInterval
猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2017-07-09
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多