【问题标题】:Vue storybook example using v-model and template?使用 v-model 和模板的 Vue 故事书示例?
【发布时间】:2021-06-16 03:30:22
【问题描述】:

如何在vue storybook 中使用v-model?在我的例子中,它只是一个最终用户可以与v-model 一起使用的自定义组件。我有以下示例:

const dateRange = [
  new Date('2014/5/14').toISOString(),
  new Date('2015/2/2').toISOString(),
]

const Template = (args, { argTypes }) => ({
  components: { DateRangePicker },
  data: () => ({ dateRange }),
  props: Object.keys(argTypes),
  template:
    '<DateRangePicker v-bind="$props" v-model="dateRange" @input="onInput" />',
})

export const Default = Template.bind({})

Default.args = {
  dateRange: [], // if i remove this line, error is gone but i can't use a different default value for v-model via the template and all stories use the same value for `dateRange`.
}

如果我执行上述操作,则会出现以下错误:The data property "dateRange" is already declared as a prop. Use prop default value instead.。我正在尝试使用以v-model 传递的不同值示例编写故事案例@

【问题讨论】:

    标签: vue.js storybook


    【解决方案1】:

    问题是你定义了同一个变量dateRange的两个实例,一个是data: () =&gt; ({ dateRange }),的数据,一个是v-bind="$props"的prop。

    要解决此问题,您需要删除数据或道具。

    如果您删除数据,您将遇到不同的问题,那就是您正在尝试使用 v-model 修改 parent prop。 Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "dateRange"

    如果你移除了这个prop,你就不能用控件的值来修改它或者导出不同的case。

    解决方案

    1. 保留您的道具 dateRange 以便于创建不同的案例
    2. 重命名 v-model,查看任何更改的 dateRage 属性并更新 v-model。
    3. 您可以决定是否使用 dateRange 保留绑定。 *
    const range = [
      new Date('2014/5/14').toISOString(),
      new Date('2015/2/2').toISOString(),
    ]
    
    const Template = (args, { argTypes }) => ({
      components: { DateRangePicker },
      data: () => ({ range }),
      props: Object.keys(argTypes),
      template: '<DateRangePicker v-bind="propsWithoutRange" v-model="range" @input="onInput" />',
      watch: {
          dateRange(value) {
              if (value.length === 2) {
                  this.range = value;
              }
          }
      },
      computed: {
          // *Optional
          propsWithoutRange() {
              const { dateRange, ...all } = this.$props;
              return all;
          }
      }
    })
    
    export const Default = Template.bind({})
    Default.args = {
      dateRange: []
    }
    

    【讨论】:

    • 你在v-bind指令中有一个额外的$,它是propsWithoutRange
    猜你喜欢
    • 2018-09-19
    • 2022-12-30
    • 2021-06-06
    • 2020-09-26
    • 1970-01-01
    • 2020-02-25
    • 2019-02-14
    • 2019-12-14
    • 2020-12-12
    相关资源
    最近更新 更多