【问题标题】:How to append input data to props in Vue.js如何将输入数据附加到 Vue.js 中的道具
【发布时间】:2019-06-04 00:36:54
【问题描述】:

我正在尝试使用 splice() 方法将用户输入字符串值添加到我的 Vue.js 组件中的 props 数组,但我得到一个空数组。有人可以帮忙找到一种方法将 props 数组与 select 标签中的用户输入值合并吗?

刀片:

<briefing-signup form_name="new-york-25.01.19-blog" :tags="['TT: i-nexus: Breakfast meeting - New York', 'Blog']" event="Hoshin/Strategy Execution Executive Briefing | New York, 29th Jan 2019" v-cloak></briefing-signup>

Vue 组件:

       <form>
                  <b-field label="Select a session">                       
                    <b-select placeholder="Which session?" 
                          v-model="form.session" expanded>
                      <option                           
                          value="1"
                          key="1">
                          Attend 1
                      </option>
                      <option                           
                          value="2"
                          key="2">
                          Attend 2
                      </option>                          
                    </b-select>                         
                  </b-field>                     

                 <button>Register</button>              
        </form>

Vue组件脚本部分:

<script>
export default {
    props: ['tags'],

    data() {
        return {             
            form: new Form({                    
                session: '',     
                tags: this.tags.splice(1, 0, this.session)               
            })                             
        }
    },      

    methods: {        

    }
}

【问题讨论】:

  • 带有splice 的行会添加元素,但随后 splice 不会返回数组本身。这就是为什么你的问题。将该行移到前面,然后将其分配给 this.tags
  • 感谢您的回复。您能否详细说明一下-“之前移动那条线”是什么意思?谢谢
  • 添加了答案

标签: javascript php laravel vue.js


【解决方案1】:

最后搞定了。谢谢大家的回复和帮助。

这是适合我的代码 sn-p:

selectChange() { 
          var arrcount = this.form.tags;

          if(arrcount.length !== 2) {
            this.form.tags.splice(2,1);
          }
          this.form.tags.push(this.form.session);
        },

【讨论】:

    【解决方案2】:

    猜猜看,我设法通过在标签上设置 v-on:input="SelectChange" 将选择输入附加到血腥的道具数组中。然后在我的方法中我输入:

    selectChange() {            
            this.form.tags = Array.isArray(this.form.tags.splice(1, 0, this.form.session)) ? this.form.tags : [];
          },
    

    它有效,但现在的问题是,如果您选择多个选项,它会将每个选项附加到数组而不是替换它们。

    【讨论】:

      【解决方案3】:

      您应该查看有关拼接的文档。

      返回值

      包含已删除元素的数组。如果仅删除一个元素,则返回一个包含一个元素的数组。如果没有元素被移除,则返回一个空数组。

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

      编辑:

      只是改变

      data() {
          return {             
              form: new Form({                    
                  session: '',     
                  tags: this.tags.splice(1, 0, this.session)               
              })                             
          }
      },
      

      data() {
          this.tags.splice(1, 0, this.session);
          return {             
              form: new Form({                    
                  session: '',     
                  tags: this.tags               
              })                             
          }
      },
      

      【讨论】:

      • 我有点困惑,您发送的链接中的示例表明,如果您将第二个参数作为 0 传递,则不会删除任何项目,只会将新项目添加到数组中 - 这是他们的例如: var months = ['Jan', 'March', 'April', 'June']; months.splice(1, 0, '新项目');
      • 没错。 Splice 可以从指定索引开始删除指定数量的元素,也可以从指定索引开始再次添加元素。我提供的链接是来自 Mozilla 的函数文档。在任何情况下,它都不会返回您调用它的数组,而是返回已删除的项目(如果有)。
      • 感谢您的回复。我尝试在返回之前移动 splice() 行并在我的数组中得到未定义:tags:Array[3] 0:"TT: i-nexus: Breakfast meeting - New York" 1:undefined 2:"i-nexus website"
      • 它可能是未定义的,因为它不是form.session。不过,我尝试添加表单。到它并且仍然不确定:(
      【解决方案4】:

      splice 在末尾提供元素,将元素添加到数组中,在您作为第一个参数提供的给定索引处,

      如果您也提供第二个参数,而不是 0,它会替换元素。

      但在任何情况下,它都会返回一个已删除元素的数组,在添加的情况下它是一个空数组。

      所以当你这样做时:

      this.tags.splice(1, 0, this.session)   
      

      它返回一个空数组,你将一个空数组分配给 tags prop。

      您可以通过以下方式解决问题:

      export default {
          props: ['tags'],
      
          data() {
              return {             
                  form: new Form({                    
                      session: '',     
                      tags: Array.isArray(this.tags.splice(1, 0, this.session)) ? this.tags : []               
                  })                             
              }
          },      
      
          methods: {        
      
          }
      }
      

      但这是一个很好的解决方法,因为您的 this.session 仅存在于您正在创建的 Form 中。

      更好的方法可能是:

      data() {
        const form = new Form({ session: '', tags: this.tags});
        form.tags.splice(1, 0, form.session);   
        return {
          form
        }
      },    
      

      【讨论】:

      • 如果我使用第二种方法,我会在标签数组中得到一个空字符串:form:Object company:"" consent:"" email:"" errors:Object event_name:"Hoshin/Strategy Execution Executive Briefing | New York, 29th Jan 2019" first_name:"" form_name:"new-york-25.01.19-website" interested_to_speak:"" job_title:"" last_name:"" loading:false originalData:Object phone:"" session:"Attend executive breakfast only" tags:Array[3] 0:"TT: i-nexus: Breakfast meeting - New York" 1:"" 2:"i-nexus website" isEventModalActive:true
      • 使用第一种方法在标签数组中返回一个未定义的字符串:tags:Array[3] 0:"TT: i-nexus: Breakfast meeting - New York" 1:undefined 2:"i-nexus website" isEventModalActive:false
      • 它太粗了——我不能在这里发布。相反,我在 Google Drive 上上传了两个文件 - Form.js 和 Errors.js drive.google.com/drive/folders/…
      • 很抱歉,这实在是太宽泛了。您的问题出在构造函数中。从上面的代码来看,您似乎总是希望将 tags 初始化为您提供的标签以及您提供的会话。然后在构造函数中移动这个逻辑。但是,我很抱歉这太宽泛了。你上面提到的问题是因为splice
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2021-02-26
      • 2014-06-22
      • 2017-06-14
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多