为什么不能使用直接赋值的形式修改原数组中的值?

为什么不能使用直接赋值的形式修改原数组中的值?

我使用了splice方法后才能点击就更新数值,如果直接赋值的形式,只有再次点击添加才会更新

正在回答

登陆购买课程后可参与讨论,去登陆

5回答

同学你好,splice()方法会把指定位置的元素删除,再把新的元素插入到原来的数组,从删除到再新添加,data是能监听到数组的变化的,关于this.list[index] = 'aaa';方法问题,我们换个思路来理解,比如原来数组中有4个元素,即便是你给其中一个元素赋值了,但是data监听到的是你数组中还是4个元素,那么,解析的时候,data会认为你的数据是没有变化的,就不会去更新数据,但是当你重新输入,再去添加一个元素的时候,因为数组中的元素个数发生了变化,data这个时候才会监听到数据变化了,从而更新数据。

祝学习愉快!

卡布琦诺 2020-05-19 18:28:33

同学你好,老师理解你说的两种方法的区别了,下面老师帮你详细分析原因:

1、首先我们知道,在vue中data:{}是用来监听数据的,而在同学的代码中, list:[]是在data:{}中,也就是data会监听list:[]的变化。

2、我们知道splice()方法会改变原始数组,也就是说splice(index,1,now)会用now值替换掉原数组中(index,1)这个位置的值。因为原始数组被改变,所以data:{}能够监听到list:[]的变化,说白了就是data:{}监听到了数据的变化,就会更新数据,这个时候点击删除,就会更新值。

3、使用this.list[index] = 'aaa';这种方法,虽然给数组中的元素进行了赋值,但是并不会改变原有的数组,也就是当点击删除的时候,data:{}监听到的还是原始数组,数据没有变化,就不会更新,但是当重新输入内容,点击提交,这个时候原始数组因为有新的元素插入,就会被更改,data:{}监听到了数据的变化,从而更新数据,才会使aaa生效。

希望可以帮到你,祝学习愉快!

  • 提问者 lcyjerry #1
    还是没有理解为什么插入的数据只有在点击提交后才会更新,那我赋值的时候这个值不是已经被我改变了吗,为什么还需要再次点击提交才会看到改变?
    2020-05-19 18:49:02
  • 提问者 lcyjerry #2
    为什么只有在点击提交后原始数组才会更新呢?
    2020-05-19 18:50:58
  • 卡布琦诺 回复 提问者 lcyjerry #3
    老师在上面回复同学了,同学可以在上面的回答中查看解答~
    2020-05-19 19:15:09
卡布琦诺 2020-05-19 10:12:12

同学你好,同学指的是如下的代码么?关于这段代码,老师测试两种方法结果是一样的

http://img1.sycdn.imooc.com//climg/5ec3406009e07e7706270153.jpg

祝学习愉快!

  • 提问者 lcyjerry #1
    不可以啊,这种代码只有在点击提交后才能发生改变
    2020-05-19 12:59:38
提问者 lcyjerry 2020-05-18 20:00:21

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

    <script src="vue.js"></script>

</head>

<body>

    

    <div id="app">

        <input type="text" v-model="inputValue">

        <button @click="btnAdd">提交</button>

        <ul>

            <todo-item  :content="item"

                        :index="index"

                        v-for="(item,index) in list"

                        @add="plus">

            </todo-item>

        </ul>

    </div>


    <script>

        // Vue.component("todo-item",{

        //     props:['content'],

        //     template:"<li>{{content}}</li>",

        // })


        var TodoItem = {

            props:['content','index'],

            template:"<li @click='btnClick'>{{content}}</li>",

            methods:{

                btnClick:function(){

                    this.$emit('add',this.index);

                }

            }

        }


        var app = new Vue({

            el:'#app',


            data:{

                list:[],

                inputValue:''

            },


            components:{

                TodoItem

            },

            

            methods: {

                btnAdd:function() {

                    this.list.push(this.inputValue);

                    this.inputValue = '';

                },


                plus:function(index) {

                    // let now = Number(this.list[index]) + 1;

                    // this.list.splice(index,1,now)

                    this.list[index] = 'aaa';

                }

            },

        })

    </script>

</body>

</html>


卡布琦诺 2020-05-18 19:04:22

同学你好,请问是在做2-14编程题的时候遇到这个问题的么?如果是,建议同学将代码贴上来,便于更加准确的定位问题并帮助解答。

祝学习愉快!

  • 提问者 lcyjerry #1
    我回复在上面的回答里了
    2020-05-18 20:00:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师