【问题标题】:vue3: control property with a timed functionvue3:具有定时功能的控制属性
【发布时间】:2021-05-24 12:48:49
【问题描述】:

首先,我是一名新的 vuejs 开发人员,我的目的是熟悉 Vue,因此,不会使用任何外部插件或组件。

我正在编写一个简单的警报组件,如下所示:

<Alert :show="showAlert" />

我希望show 属性在 2 秒后返回 false。如何从组件内部执行此操作(即,不在使用此组件的页面中)。我试过这个:

import { computed } from 'vue';
export default {
  props: ['show'],
  setup(props) {
      const shown = computed(() => {
          if (props.show) {
              setTimeout(() => {
                  console.log("hiding the alert...")
                  props.show = false
              }, 2000);
          }
          return props.show.value
      })
      return { shown }
  }
};

编译器说:

14:15  error  Unexpected timed function in computed function  vue/no-async-in-computed-properties
16:19  error  Unexpected mutation of "show" prop              vue/no-mutating-props

我的理由是,alert 的延迟应该由 alert 组件控制(可以通过 prop 更改),而不是强迫调用者写一些类似的东西:

function Alert(delay) {
    showAlert = true
    setTimeout(() => showAlert = false, delay)
}

【问题讨论】:

    标签: vue.js vuejs3


    【解决方案1】:

    有 2 个错误。

    第一个 vue/no-mutating-props,props 是只读的,所以你不应该从组件内部更改它。仍然可以从组件外部更改 props 并向下传递给它。

    为此,您应该将 props 的值复制到您的 data()

    data() {
      return {
        showAlert
      }
    }
    

    您应该可以毫无问题地更新showAlert

    第二个错误vue/no-async-in-computed-properties,你不能在computed()里面写异步函数,所以替代方法是用watch代替。

    【讨论】:

    • 手表与终身挂钩,哪个更受欢迎?
    • 生命周期钩子似乎不起作用,无论是 onMounted() 还是 onUpdated()。问题是它只对一个有效,但不能重复。
    • 我没有。根据我到目前为止的尝试,我估计不会成功。问题似乎是组件无法影响其父组件,因此即使它成功关闭警报,您第二次按下父组件中的按钮也无法再触发警报。 @anurat-chapanond
    • @xrfang 似乎您想更改父级的数据,那么您应该从组件调用 $emit('some event name', data) 然后让父级捕获它。 v3.vuejs.org/guide/migration/emits-option.html#emits-option
    猜你喜欢
    • 2021-10-13
    • 2012-10-29
    • 1970-01-01
    • 2021-12-31
    • 2014-02-26
    • 2021-08-16
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多