javascript - 设计一个无需事件即可提供数据的 VueJS 组件

标签 javascript vue.js vuejs2 vue-component

我正在尝试设计一个在 VueJS 中选择日期范围的组件。从组件通过 props 获取的特定键(“realtime”、“today”、“yesterday”)或用户使用选择器更改的特定键(“realtime”、“today”、“yesterday”),它将返回:

  • 作为 JS Date 对象的开始/停止日期
  • 开始/停止该时期的人类再现
  • 根据区域设置对 key 进行人工表示。

我的概念目标是使用这样的组件(无效语法,但这只是为了解释问题):

Select your period:
<DateRangeSelector v-model="drskey" ref="drs">

Selected period: {{ drs.periodName }}
Dates: {{ drs.dateStartHuman }} to {{ drs.dateStopHuman }}

请注意:

  • 没有 VueX 状态(无需在全局状态中存储任何内容)
  • 除了“父”组件中的“ key ”之外,我不想存储任何其他内容
  • refs 不起作用,因为它们没有在开始时初始化

有什么建议吗?

最佳答案

如果您不想在父组件中存储除“键”之外的任何内容,那么为什么不将生成的字符串的输出移动到子组件本身中。 然后你可以观察 props 或 select 输入的变化并输出字符串,而无需返回父级......

但是,如果您的用例示例不完整并且您需要对父级中的数据执行更多操作,那么另一种方法是让 v-model 使用对象而不是字符串。类似于 {key: 'realtime'}。然后在子组件内部,当值发生变化时,您可以使用“填充”对象发出“输入”事件,在其中添加所有计算数据。因此,在父组件中,您将完全按照所示方式使用数据在你的例子中..像这样:

父组件:

    Select your period:
    <data-range-selector v-model="drs" />
    Selected period: {{ drs.periodName }}
    Dates: {{ drs.dateStartHuman }} to {{ drs.dateStopHuman }}
    {    
      data: () => ({ 
        drs: {key: 'realtime'} 
      })
    }

子组件:

<input v-model="key">
    {
      props: { value: Object },
      data: () => ({ key: '' }),
      watch: {
        value () { this.key = this.value.key },
        key () { this.returnResults()   }
      },
      created () {
          this.key = this.value.key
          this.returnResults()
      },
        computed: {
        periodName () { return this.key },
        dateStartHuman () { return `When ${this.key} starts` },
        dateStopHuman () { return `When ${this.key} stops` }
      },

      methods: {
        returnResults () {
          this.$emit('input', {
            key: this.key,
            periodName: this.periodName, 
            dateStartHuman: this.dateStartHuman,
            dateStopHuman: this.dateStopHuman
          })
        }
      }
    }

这是工作 fiddle .. https://jsfiddle.net/tyminko/jwLet0n5/13/

关于javascript - 设计一个无需事件即可提供数据的 VueJS 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58082135/

相关文章:

javascript - Chrome 应用程序 eval()

JavaScript Array.map() 将逗号附加到 DOM

vue.js - 如何在 Vue.js 中渲染 Symfony 表单?

javascript - 为什么我的 Vue 组件在使用 Webpack 代码拆分时不显示?

javascript - 管理从方法到模板语法的数据数组 Vue

javascript - XRM setDisable() 在 IE 以外的浏览器上不起作用

javascript - 没有为 Android 中的 PhoneGap 定义的 JS FormData 对象

vue.js - 将 Vue Sfc 添加到现有项目

vue.js - 绑定(bind)到 getter 的计算属性在从 Vuex 状态对象中按键删除项目时不会更新

vuejs2 - 如果用户已经通过身份验证,使用 vue.js 和 Auth0 如何跳过登录页面?