Dan*_*est 6 javascript vue.js vuejs2
您能解释一下以不同方式声明变量之间的区别吗?我什么时候应该使用这些声明方式?
<script>
const someVariable = 12345
export default {
name: 'App',
}
</script>
Run Code Online (Sandbox Code Playgroud)
<script>
export default {
name: 'App',
data() {
return {
someVariable: 12345
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
在第一个中,您不能someVariable在模板中使用
<script>
const someVariable = 12345
export default {
name: 'App',
}
</script>
<template> <p> {{someVariable}} </p> </template> //doesn't work
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您可以setup在脚本中添加一个关键字,但如果您想让它对更改做出反应ref(...),则必须用or包装您的变量值更多信息reactive(...)
<script setup>
const someVariable = 12345
export default {
name: 'App',
}
</script>
<template> <p> {{someVariable}} </p> </template> //works (you can see the data)
Run Code Online (Sandbox Code Playgroud)
典型的单文件组件如下所示:
<template>
...
</template>
<script>
...
</script>
Run Code Online (Sandbox Code Playgroud)
export,那么它只是一个普通的 JavaScript 变量,您可以在脚本标记内的任何位置使用。它不绑定到组件,也不以任何方式与 Vue 相关。优点:
<script>元素的范围内。this。<template>。优点:
<template>$vm.data.someVarData,例如,将变量添加到 Vue 组件的实例中。<template>
<div>
<div :class="someVarData"/> <!-- This is Ok -->
<div :class="someVar"/> <!-- This is not Ok -->
</div>
<template>
<script>
const someVar = "blah";
export default {
data() {
return {
someVarData: "blahData",
};
},
mounted() {
const el = document.getElementById('myId');
el.addEventListener('mouseenter', function () {
console.log(someVar); // This is Ok
console.log(this.someVarData); // This is not Ok
});
},
beforeRouteEnter() { // <--- Vue-router's Navigation guard
console.log(someVar); // This is Ok
console.log(this.someVarData); // This is not Ok
},
</script>
Run Code Online (Sandbox Code Playgroud)
因此,您应该避免在导出之外定义变量,因为它们会让您更难理解代码的流程。几乎总是有某种方法可以重新设计您的方法,以不使用导出之外的变量。
例如,在上面的示例中,您仍然可以在钩子mounted和导航防护中使用数据变量,但需要进行一些更改:
mounted() {
const el = document.getElementById('myId');
el.addEventListener('mouseenter', () => {
console.log(someVar); // This is Ok
console.log(this.someVarData); // Ok - works because we change the function to arrow function, so it is bound to the instance's `this`
});
el.addEventListener('mouseenter', function () {
console.log(someVar); // This is Ok
console.log(this.someVarData); // Ok - works because we have manually bound the function to the instance's `this`
}.bind(this));
},
beforeRouteEnter(to, from, next) { // <--- Vue-router's Navigation guard
console.log(someVar); // This is Ok
console.log(this.someVarData); // This is not Ok
next((vm) => {
console.log(vm.someVarData); // Ok - Navigation guard's next function provides the instance's context as a callback parameter
});
},
Run Code Online (Sandbox Code Playgroud)