Vue数据单向流的深入理解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/github_35631540/article/details/100558455

大家都知道在VuE组件中我们使用props来接受父组件传入的值

这个值可是数字 布尔值 数组 对象,正如Vue官网所介绍,所有的prop都使其父子prop之间形成一个单向下行绑定,

即:父级prop的更新会向下流动到子组件中,但是反过来则不行,如果强行修改变量值,则会发出警告. 这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流难以理解.

但这里的单向数据流却有一个限制, 就是所传的变量必须是基本数据类型,数字,布尔,字符串, 而数组和对象则是双向绑定,在子组件中修改了父组件传进来的一个数组,同时会作用到父组件上,从而影响父组件的状态.

 

官网也有类似的描述,如下:

注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。

 

官网是学习一本技术最好的地方,大家不用再去盲目第  搜索资料.

文章创建于: 2019-09-05 15:06:17
展开阅读全文

final的深入理解 – final数据

07-28

先通过例子看一看:rnrn[code=java]rnpackage com.sotaof.testfinal; rn rnpublic class Value rn int i; rn public Value(int i) rn this.i = i; rn rn [/code] rnrn[code=java]rnpackage com.sotaof.testfinal; rn rnimport java.util.Random; rn rnpublic class FinalData rn rn private static Random rand = new Random(47); rn private String id; rn public FinalData(String id) rn this.id = id; rn rn private final int valueOne = 9; rn private static final int VALUE_TWO = 99; rn public static final int VALUE_THREE = 39; rn rn private final int i4 = rand.nextInt(20); rn static final int INT_5 = rand.nextInt(20); rn private Value v1 = new Value(11); rn private final Value v2 = new Value(22); rn private static final Value VAL_3 = new Value(33); rn rn private final int[] a = 1,2,3,4,5,6; rn public String toString() rn return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5; rn rn public static void main(String[] args) rn FinalData fd1 = new FinalData("fd1"); rn //fd1.valueOne++; 这句代码会报错,因为final修饰的基本类型数值是不可以变化的 rn fd1.v2.i++; //这句代码不会报错,因为final修饰的v2对象自身是可以变化的 rn fd1.v1 = new Value(9); //这个代码是不会报错的,就是创建一个对象,v1没有用final修饰 rn for(int i = 0; i < fd1.a.length; i++) rn fd1.a[i]++; //这句代码也是不会报错的,因为数组也是对象,而final修饰的对象自身可以变化 rn rn //fd1.v2 = new Value(0); 这句代码会报错 ,因为v2是用final修饰的,final修饰的对象自身是可以变化的, rn //但是final修饰的对象的引用是不可以变化的,所以再用v2创建对象,就说明v2的引用变化了,所以报错 rn //fd1.VAL_3 = new Value(1);和上边一样的道理 rn //fd1.a = new int[3];和上边一样的道理 rn //刚才那三段代码都是一个意思,就是说final修饰的对象,这个对象的引用是不可以变化的 rn System.out.println(fd1); rn System.out.println("Creating new FinalData"); rn FinalData fd2 = new FinalData("fd2"); rn System.out.println(fd1); rn System.out.println(fd2); rn rn rn [/code]rnrn1、我们不能因为某数据是final的就认为在编译时可以知道它的值。在运行时使用随机生成的数值来初始化i4和INT_5就说明了这一点。rnrn2、这个实例也向我们展示了将final数值定义为静态和非静态的区别,这个区别只有当数值 在运行时内 被初始化时 才会显示(这句话不容易理解,我将其用" "分开了,以方便阅读理解,细细品读),这是因为编译器对编译时数值一视同仁,当运行程序时就会看到这个区别。rnrn3、在fd1对象1中i4的值是唯一的,在fd2对象中i4的值也是唯一的,但是fd1和fd2中的i4值就不一定相同了,因为如果只有final修饰的话,在每次创建对象时都会被初始化(网友解释:i4仅仅是final类型的,分别在fd1和fd2两个对象中各开辟一块空间);rnrn4、不管是在fd1中,还是在fd2中,INT_5的值都是一样的,是不可以通过创建第二个FinalData对象而加以改变的,这是因为它是static的,在装载的时候,就被初始化,而不是每次创建新对象时都初始化(网友解释:static final 仅使用一段不能改变的空间,所以INT_5值不变)。rnrn在这里为了方便大家更多的了解final的数据,这里附上一位网友的例子,觉得很不错(http://chihom.iteye.com/blog/233035)rnrn下面的两个初始化例子rnrn[code=java]rnclass InitalizedClass rn static rn System.out.println("You have initalized InitalizedClass!"); rn rn public static int inititalize_varible = 1; rn rn rn rnpublic class TestInitializeClass rn public static void main(String[] args) rn System.out.println(InitalizedClass.inititalize_varible); rn rn rn rn [/code]rnrn上面的结果是: rnYou have initalized nitalizedClass! rn1 rnrn再看下面的例子 rnrn[code=java]rnclass InitalizedClass rn static rn System.out.println("You have initalized InitalizedClass!"); rn rn //和上面的例子唯一的差异就是此处的变量INITIALIZED_VARIBLE被声明为final rn public final static int INITIALIZED_VARIBLE = 1; rn rn rn rnpublic class TestInitializeClass rn public static void main(String[] args) rn System.out.println(InitalizedClass.INITIALIZED_VARIBLE); rn rn rn rn [/code]rnrn上面的结果是: rn1 rn这里大家会问:为什么两个例子执行结果不一样?rnrn原因是第二个例子中的INITIALIZED_VARIBLE为编译期常量,它不会导致类的初始化,也就是说,我第一个例子中,"InitalizedClass.inititalize_varible"这句代码会进入InitalizedClass这个类中,并执行static那段儿代码;而第二个例子中,"InitalizedClass.INITIALIZED_VARIBLE"这句代码并不会进入InitalizedClass这个类中,那有人会说,不进入这个类中怎么可能调用到INITIALIZED_VARIBLE这个值呢?因为我这个程序在编译的时候就初始化了,内存中已经存在INITIALIZED_VARIBLE这个值了,所以不再需要调用InitalizedClass类,这样大家应该理解了吧。rnrn[color=#FF0000]我也是今天才有了一点儿的理解,不过还是有一个疑问,希望各位网友能帮忙解决:rnrnprivate final int valueOne = 9;rnrnprivate final int i = rand.nextInt(20);rnrn这两个代码,分别是在什么时候初始化的,我的理解是,valueOne和 i 都是编译时常量,但valueOne在编译的时候就初始化了,编译的时候就知道valueOne的值了,而 i 则是在运行时进行初始化的,运行的时候才会知道它的值。[/color] 论坛

没有更多推荐了,返回首页