美文网首页
vue :for循环渲染,手动给input的v-model预设值

vue :for循环渲染,手动给input的v-model预设值

作者: 鲜蛋卷小狐狸 | 来源:发表于2020-01-02 14:35 被阅读0次

    ```

    <div v-for="(pds,index) in addList" :key="index">

                 <div class="searchItem">

                        <!-- 商品图 -->

                        <div class="pdsImg">

                          <img :src="pds.defaultImg" alt="">

                        </div>

                        <!-- 商品名称 -->

                        <div class="pdsNameItem">{{pds.productName}}</div>

                        <!-- 规格名称 -->

                        <div class="pdsSizeItem">{{pds.productSizeNames | pdsNameFilter}}</div>

                        <!-- 价格 -->

                        <div class="pdsPrice">

                          <a-input type="number" @input="handlePdsPriceChange"  v-model="pds.sellingPrice" @mousewheel.native.prevent ></a-input>

                        </div>

                        <!-- 数量 -->

                        <div class="pdsQuantity">

                                  <a-select :defaultValue="numberData[0]" style="width:82px;" v-model="pds.productAmount"  :getPopupContainer="triggerNode => triggerNode.parentNode" >

                            <a-select-option v-for="item in numberData" :key="item">{{item}}</a-select-option>

                          </a-select>

                        </div>

                        <div class="pdsOperationItem">

                          <a-button @click="deleteList(index)">移除</a-button>

                        </div>

                </div>

              </div>

    ```

    如上的for循环,循环数组是addlist。其中价格sellingPrice和数量productAmount是v-model绑定的并且在渲染时这两个属性不存在,所以渲染不上值,没关系,当input输入时和a-select选择器选择时vue会自动建立这个属性,到此没有问题。

    但是,要求价格sellingPrice和数量productAmount要有预设值,sellingPrice预设0,数量productAmount预设1,我在调接口拉取到数值时,操作了新加属性并且给预设值,如下: 就出现input无法输入,a-select无法选择的问题,

    ```

    postAction(this.url.pdslist, this.queryParam).then(res => {

            console.log(res.result.records)

            if (res.success) {

                 this.addlist= res.result.records

    this.addlist.forEach(item=>{

                    item.sellingPrice = '0'

                    item.productAmount = '1'

                  })

            }

            this.showLoading = false

          })

    ```

    先说解决方法:如下,

    ```

    postAction(this.url.pdslist, this.queryParam).then(res => {

            console.log(res.result.records)

            if (res.success) {

    res.result.records.forEach(item=>{

                    item.sellingPrice = '0'

                    item.productAmount = '1'

                  })

    this.addlist= res.result.records

            }

            this.showLoading = false

          })

    ```

    分析原因:

    v-model本质上是一个语法糖。如下代码

    <input v-model="test">

    本质上是

    <input :value="test" @input="test = $event.target.value">

    其中@input是对<input>输入事件的一个监听:value="test"是将监听事件中的数据放入到input,

    v-model不仅可以给input赋值还可以获取input中的数据,而且数据的获取是实时的,也就是双向绑定。

    在beforeMount这个生命周期之前,Vue开始编译模板,把Vue代码中的那些指令进行执行,最终在内存中生成一个最终模板字符串,然后,把这个模板字符串,渲染为内存中的DOM,此时,只是在内存中,渲染好了模板,并没有把模板放在到页面中去

    这里就已经绑定好了v-model,

    调接口加属性,是生命周期mounted之后,这时实例已经被完全创建好了,这时可以添加新属性,但是添加了一个与之前绑定好的属性名相同,就引起了混乱。

    而修改res中的数组不会出问题,因为绑定的不是res。

    欢迎评论交流~~

    相关文章

      网友评论

          本文标题:vue :for循环渲染,手动给input的v-model预设值

          本文链接:https://www.haomeiwen.com/subject/vkuzoctx.html