Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗? #558

Open
haizhilin2013 opened this issue Jul 2, 2019 · 16 comments
Labels
vue vue

Comments

@haizhilin2013
Copy link
Collaborator

[vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗?

@haizhilin2013 haizhilin2013 added the vue vue label Jul 2, 2019
@zyronon
Copy link

zyronon commented Jul 2, 2019

不可以,同名会报错:The computed property "xxxx" is already defined in data

@llccing
Copy link

llccing commented Jul 4, 2019

https://github.com/vuejs/vue/blob/dev/src/core/instance/state.js#L202 此处校验不会通过

@Myh-cs
Copy link

Myh-cs commented Jul 9, 2019

不能同名 因为不管是计算属性还是data还是props 都会被挂载在vm实例上,因此 这三个都不能同名

@remip518
Copy link

不可以,写在计算属性中的数据名称,不能在data中定义

@wush12
Copy link

wush12 commented Nov 5, 2019

不可以,因为初始化vm的过程,会先把data绑定到vm,再把computed的值绑定到vm,会把data覆盖了

@ajh99990
Copy link

ajh99990 commented Dec 4, 2019

莫名其妙的问题。可以同名,但data会覆盖methods。并且本就不该同名,同名说明你命名不规范。
然后解释为什么会覆盖,因为Props、methods、data、computed、watch都是在initState函数中被初始化的。初始化顺序就是我上面给出的顺序,本质上这些都是要挂载到this上面的,你如果重名的话,后面出现的属性自然而然会覆盖之前挂载的属性了。如果你的eslint配置比较严格的话,同名是编译不通过的。

@songkangle0826
Copy link

莫名其妙的问题。可以同名,但data会覆盖methods。并且本就不该同名,同名说明你命名不规范。
然后解释为什么会覆盖,因为Props、methods、data、computed、watch都是在initState函数中被初始化的。初始化顺序就是我上面给出的顺序,本质上这些都是要挂载到this上面的,你如果重名的话,后面出现的属性自然而然会覆盖之前挂载的属性了。如果你的eslint配置比较严格的话,同名是编译不通过的。

不可以,因为初始化vm的过程,会先把data绑定到vm,再把computed的值绑定到vm,会把data覆盖了

其实是可以同名的, 不是先把data绑定到vm,初始化顺序是这样的,先computed,methods,data,props

@Good-XiaAo
Copy link

为什么会有这样的问题?有点脑残了吧

@TieHanHanYa
Copy link

莫名其妙的问题。可以同名,但data会覆盖methods。并且本就不该同名,同名说明你命名不规范。
然后解释为什么会覆盖,因为Props、methods、data、computed、watch都是在initState函数中被初始化的。初始化顺序就是我上面给出的顺序,本质上这些都是要挂载到this上面的,你如果重名的话,后面出现的属性自然而然会覆盖之前挂载的属性了。如果你的eslint配置比较严格的话,同名是编译不通过的。

不可以,因为初始化vm的过程,会先把data绑定到vm,再把computed的值绑定到vm,会把data覆盖了

其实是可以同名的, 不是先把data绑定到vm,初始化顺序是这样的,先computed,methods,data,props

正确顺序:props、methods、data、computed、watch、

@laozhan0000
Copy link

不可以,会报错,
[Vue warn]: The computed property "a" is already defined in data.

@crush2020
Copy link

crush2020 commented Jan 28, 2021

不能同名,不管是方法,计算属性还是data最后都会挂载到vue实例上去,如果同名了就会把其中一条覆盖掉,那你写的计算属性,方法,在data中定义的数据,就没有什么意义了

@hyj443
Copy link

hyj443 commented Oct 27, 2021

在initComputed执行时,会先看看当前vm实例的原型链上有没有这个key,用的in操作符判断

如果没有,那就创建computed
如果有,是不会创建的,并会看看它在哪里被你定义过,然后依次看看是不是在data props methods里被定义了,告诉你别和他们重名了。

@sc950828
Copy link

@wenjiechen0913
Copy link

computed
真的就有这种问题吧

@wenjiechen0913
Copy link

Props、methods、data、computed、watch都是在initState函数中被初始化的。初始化顺序就是我上面给出的顺序,本质上这些都是要挂载到this上面的,你如果重名的话,后面出现的属性自然而然会覆盖之前挂载的属性了。

image
人家说的初始化顺序没错,调用顺序就是这样的

@wenjiechen0913
Copy link

不能同名 因为不管是计算属性还是data还是props 都会被挂载在vm实例上,因此 这三个都不能同名

可以同名的吧,只是会告警而已,又不会报错。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
vue vue
Projects
None yet
Development

No branches or pull requests