[问题] Vue关于data为什么要用function

楼主: heavenbetula (绿草)   2023-07-09 14:44:54
大家好最近在唸vue
相信关于为什么data要使用function已经被讨论到烂掉
看了很多讲解都是下面的例子
const MyComponent = function() {};
MyComponent.prototype.data ={
a: 1,
b: 2,
};
const component1 = new MyComponent();
const component2 = new MyComponent();
component1.data.b = 5;
console.log(component2.data)
↑因为会共享同一个reference
作者: cloki (夜云天)   2023-07-09 21:25:00
你的data不会永远只用{a:1,b:2},要用别的就会把data拆出来如果只用object的话你直接改就会动让每个实体的data都变成5,如果用callback的话才会让this.data每次都是新的默认值
作者: ck574b027 (荒围!定厝!贼!妹!)   2023-07-10 08:02:00
你的举例是一样意思,constructor也是function。不要在js使用prototype,语意会让你误会很多东西。
作者: ssccg (23)   2023-07-10 10:04:00
function随时可呼叫,为什么你会觉得constructor有比较好?data又不一定要是在new Component的时候呼叫,独立的function之后如果需要取回data默认值,随时都能呼叫data()怎么会没事想去选个最没弹性的写法
作者: cloki (夜云天)   2023-07-12 16:56:00
因为在设计的概念上就不想直接把data的内容写进去啊然后那个例子就告诉你不用function的话就会把原型内的值一并改掉,所以不能用object应该用function,没弄清楚的话先把例如里面的值都print出来比较一下
作者: microloft (微阁)   2023-07-12 18:06:00
没有,原po最后一段用obj的写法就已经不会共用ref了所以用func并不是必要,只是一种写法选择
作者: cloki (夜云天)   2023-07-15 01:50:00
感谢m大 原来我理解是错的 那分别就只是那是没有es6的写法?
作者: microloft (微阁)   2023-07-15 02:47:00
如果我没弄错,那写法/机制应该上古时期就有了,ES6只多加入了更直观的class宣告语法。所以多套一层func除了上面提到的回复默认值外,老实说我也想不到还有什么其他好处...
作者: ck574b027 (荒围!定厝!贼!妹!)   2023-07-16 10:55:00
不会共用的原因是因为用了function,只是前者叫data()后者是constructor,不要误导人为何要用前者当范例,因为是好习惯与其纠结这个不如去看vue3
作者: microloft (微阁)   2023-07-16 17:26:00
并不是,原po共列了3种写法,1会共用,2跟3不会。根本的差别是1直接操作原型炼物件的data的属性,2跟3则写在建构子里,在初始化时会另生一份。所以赋值给data时是用func(2)还是物件(3)并不是是否会共用的原因。范例2里的data()从来就没有扮演建构子的角色1~3的建构子都同样是MyComponent
作者: ck574b027 (荒围!定厝!贼!妹!)   2023-07-19 00:18:00
这样讲没有触碰到本质,物件(3)不会共用是因为他的位置在建构子。偷用了正确方式来说他是对的根本狐假虎威把范例的建构子拿掉,在new之后才赋值给data比较清楚(2) component1.data = init()(3) component1.data = {...}说func不是必要,结果利用的建构子还是func,你绍安吗
作者: microloft (微阁)   2023-07-19 01:55:00
麻烦你看清楚,原po这篇本来就是在问为什么都移到建构子里了还要多用data()这个func,前面有人说是因为共用问题,我才会回复说func并不是必要,因为根本的原因不在那里另外你提到的“本质”我前面明明就讲过一样的了...
作者: ssccg (23)   2023-07-21 10:18:00
我觉得是原PO死读书,虽然教学说data用function是避免重复用到同一个物件,但那就不是唯一的原因啊,本来就有很多方法达成这个效果,我相信写讲解的人也只是要表示“有这个效果是设计目标之一”而不是“只有这个设计能达这效果”

Links booklink

Contact Us: admin [ a t ] ucptt.com