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] vue中data的属性可以和methods中的方法同名吗?为什么? #557

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

Comments

@haizhilin2013
Copy link
Collaborator

[vue] vue中data的属性可以和methods中的方法同名吗?为什么?

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

zyronon commented Jul 2, 2019

不能,会报错。

@mying01
Copy link

mying01 commented Jul 4, 2019

Method "xxx" has already been defined as a data property

@llccing
Copy link

llccing commented Jul 4, 2019

@mying01 , 贴一下vue.js代码中的位置

@webwhy
Copy link

webwhy commented Jul 12, 2019

可以,但eslint不允许你这么做

@xiguan-wuge
Copy link

会报错(关闭了eslint校验),比如是在使用饿了么组件时,声明一个同名的data 属性和methods方法时,会报错。添加样式的功能没有奏效。
image
image
image
image

@binnuo
Copy link

binnuo commented Jul 30, 2019

可以,但eslint不允许你这么做

不是啊,就算没有eslint依然会报错的。[Vue warn]: Method "myname" has already been defined as a data property.

@RainAley
Copy link

RainAley commented Aug 9, 2019

如果真的重名了,data中的变量会覆盖methods中的方法

@lukejian003
Copy link

data中的属性和methods方法重名会优先执行data中的属性并且报错

@seho-dev
Copy link

大家答的都对,但是为什么会先执行data中的呢

@Linkontoask
Copy link

Linkontoask commented Sep 23, 2019

错误会报出来,但是没有中断函数执行,只要不是和 props 同名并且第一个字符不是 _$ ,那么就可以使用 this 访问,然后 observe 数据。
同名的方法被干掉 TypeError: handler.apply is not a function

@InterfaceBoy
Copy link

肯定是不能同名的了,1、vue语法就会报错,2、如果同名那么你在使用this.XXX的时候是调用方法还是调用变量呢

@yangkunxiao
Copy link

不可以。在initState的时候,会对data中的属性、props、methods的属性名进行检查。出现同名立即warn

@mingyec
Copy link

mingyec commented Mar 28, 2020

为什么会先执行data,是因为组件初始化时的依赖收集会先执行

@tenadolanter
Copy link

不可以,data和methods都是挂载this上的,对象上有同名属性肯定会报错

@cookingHero
Copy link

源码 中的 initData() 方法
if (methods && hasOwn(methods, key)) { warn( Method "${key}" has already been defined as a data property., vm ) }
会取出 methods 中的方法进行判断,也就是 hasOwn(methods, key)
如果此 key 值 在 methods 中存在,会有warn 警告哦****

@laozhan0000
Copy link

不可以,会报错
[Vue warn]: Method "a" has already been defined as a data property.

@Lzp0225
Copy link

Lzp0225 commented Jan 15, 2021

原理是可以重名,但是在vue中执行initData会抛出错误;
initState中初始化opts的顺序是 props、methods、data、computed、watch所以data里的key会覆盖之前的key;

@crush2020
Copy link

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

@hyj443
Copy link

hyj443 commented Oct 27, 2021

在内部initData函数执行时,会遍历data对象的属性,如果属性名存在于method定义的名称,就会报错,告诉你method的xxx已经被定义成data属性了。

而且 initData是在 initPorps 和 initMethod 之后的

和props名冲突,也会告诉你,但告诉你 data名和prop名冲突啦,让你放弃这个data名,以prop的值为准吧

@ygh1
Copy link

ygh1 commented Feb 9, 2022

源码中做校验了,不准同名,为什么要同名,傻瓜操作

@lankeren218
Copy link

大家答的都对,但是为什么会先执行data中的呢

因为是先initdata的

@sc950828
Copy link

@wanghao9027
Copy link

不可以。不管是在data、computed 、watch 、methods都不可以重名,如果重名控制台会报错

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