在 Vue.js 里,setup
、data
和 methods
是不同的选项,下面为你详细介绍它们之间的关系,以及能否一起使用和冲突时的优先级。
三者之间的关系
data
选项:在 Vue 2 里,data
是一个函数,返回一个对象,对象里的属性会变成响应式数据,在组件模板里可以使用。示例如下:
javascript
export default {
data() {
return {
message: 'Hello, Vue!'
}
}
}
methods
选项:methods
也是一个对象,包含组件的方法。这些方法可以在模板里调用,也能在组件的其他方法里调用。示例如下:
javascript
export default {
data() {
return {
message: 'Hello, Vue!'
}
},
methods: {
greet() {
console.log(this.message);
}
}
}
setup
函数:这是 Vue 3 组合式 API 的入口。在setup
里可以使用组合式 API 来定义响应式数据、方法等。它在组件初始化时就会执行,并且在data
和methods
等选项之前执行。示例如下:
javascript
import { ref } from 'vue';
export default {
setup() {
const message = ref('Hello, Vue 3!');
const greet = () => {
console.log(message.value);
};
return {
message,
greet
};
}
}
能否一起使用
setup
可以和 data
、methods
等传统配置项一起使用。在 Vue 3 里,组合式 API 和选项式 API 是兼容的。示例如下:
javascript
import { ref } from 'vue';
export default {
data() {
return {
oldMessage: 'Hello from data'
};
},
methods: {
oldGreet() {
console.log(this.oldMessage);
}
},
setup() {
const newMessage = ref('Hello from setup');
const newGreet = () => {
console.log(newMessage.value);
};
return {
newMessage,
newGreet
};
}
};
冲突时的优先级
若 setup
里返回的属性和方法与 data
、methods
里的冲突,setup
里返回的内容会覆盖 data
和 methods
里的内容。这是因为 setup
是在组件初始化的早期执行的,它返回的属性和方法会优先注入到组件实例中。示例如下:
javascript
import { ref } from 'vue';
export default {
data() {
return {
message: 'Hello from data'
};
},
methods: {
greet() {
console.log('Old greet method');
}
},
setup() {
const message = ref('Hello from setup');
const greet = () => {
console.log('New greet method');
};
return {
message,
greet
};
}
};