如何在 Vue.js 中使用带有嵌套属性的 v-model

Posted

技术标签:

【中文标题】如何在 Vue.js 中使用带有嵌套属性的 v-model【英文标题】:How to use v-model with nested properties in Vue.js 【发布时间】:2020-01-01 15:04:23 【问题描述】:

我创建了一个表单,我正在尝试了解

这是我的模板的代码,如您所见,我正在尝试像这样引用嵌套属性:form.dobDate,但是我如何引用属性(dobDate dobMonthdobYear)在 mountedwatch 中?这样我输入的任何内容都会在页面刷新时保留在那里?

<template>
  <div>
    <b-form novalidate>
      <b-form-select name="dobDate" id="dobDate" v-model="form.dobDate" :options="optionsDays"></b-form-select>

      <b-form-select name="dobMonth" id="dobMonth" v-model="form.dobMonth" :options="optionsMonths"></b-form-select>

      <b-form-input
        placeholder="Year of Birth"
        required
        autofocus
        class="form-control"
        name="year"
        id="year"
        min="0"
        max="2003"
        type="number"
        v-model="form.dobYear"
      ></b-form-input>

      <input type="text" v-model="name" />

      <b-button type="submit" variant="primary">Submit</b-button>
    </b-form>
    <b-card class="mt-3" header="Form Data Result">
      <pre class="m-0"> form </pre>
    </b-card>
  </div>
</template>

这里是脚本代码:

<script>
export default 
  data() 
    return 
      name: "",
      form: 
        dobDate: 
          selected: ""
        ,
        dobMonth: 
          selected: ""
        ,
        dobYear: "",
        name: ""
      ,
      optionsMonths: [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"
      ],
      show: true
    ;
  ,

  mounted() 
    if (localStorage.name) 
      this.name = localStorage.name;
    
  ,
  watch: 
    name(newName) 
      localStorage.name = newName;
    ,
    deep: true
  ,

  computed: 
    optionsDays() 
      return Array.from(Array(31).keys());
    
  ,

  methods: 
    onSubmit(evt) 
      evt.preventDefault();
      alert(JSON.stringify(this.form));
    ,
    getDates() 
      return Array.from(Array(31).keys());
    
  
;
</script>

如您所见,我有一个表单对象,其中包含要绑定的嵌套属性,并且我还使用 mounted() 和 watch在页面刷新或提交表单时将数据存储在本地存储中(目前没有验证)。

【问题讨论】:

您的代码似乎正确,有什么问题? 想了解在mounted方法中和观看时如何引用属性,以便页面刷新或提交时数据保留在页面上。 没有真正关注。不就是mounted中的this.form.dobDate吗?对于watch,您需要在属性键watch: 'form.dobDate' () ... 周围加上引号。 我试过了,但这不起作用,我做错了什么?:mounted() if (localStorage.name) this.name = localStorage.name; this.form.dobDate = localStorage.form.dobDate; ,观看: name(newName) localStorage.name = newName; , "form.dobDate"(newDate) localStorage.form.name = newDate; ,深:真, localStorage 允许您存储字符串,而不是对象。您需要对它们进行适当的编码。一些背景阅读:developer.mozilla.org/en-US/docs/Web/API/Window/localStorage 【参考方案1】:

您可以深入观察form(访问其嵌套字段)并使用以下方法遍历其值:

  Object.keys(after).forEach(key=>
          localStorage[key]=after[key]
       )
 watch: 
    form: 
      handler: function(after, before) 
        Object.keys(after).forEach(key=>
          localStorage[key]=after[key]
       )
      ,
      deep: true
    
   

【讨论】:

对不起,我不明白如何将其用于解决方案,像这样?观看:形式:处理程序(newval)localStorage = newVal; ,深:真 , 是的,类似localStorage.name = newval.name; 谢谢,我最终使用了以下内容: handler: function(after, before) Object.keys(after).forEach(key => localStorage[key] = after[key]; ); ,深:真 不客气,我通过更好地解释来编辑我的答案

以上是关于如何在 Vue.js 中使用带有嵌套属性的 v-model的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套数组的 Vue Js 搜索示例

Vue.js - 如何显示所有属性键和嵌套属性值?

如何在 Vue.js 中收集没有重复的嵌套数据?

vue.js面试题总汇

使用带有 Avoriaz 的 AVA 在 Vue.js 中测试计算属性

Vue.js 观察数组内的嵌套属性