Vue 2 已于 2023 年 12 月 31 日停止维护。
(学习基础:对vue2有一定基础和理解)
选项式 API 和组合式 API:
选项式 API (Options API):
使用选项式 API,我们可以用包含多个选项的对象来描述组件的逻辑,例如 data
、methods
和 mounted
。选项所定义的属性都会暴露在函数内部的 this
上,它会指向当前的组件实例。
<script>
export default {
// data() 返回的属性将会成为响应式的状态
// 并且暴露在 `this` 上
data() {
return {
count: 0
}
},
// methods 是一些用来更改状态与触发更新的函数
// 它们可以在模板中作为事件处理器绑定
methods: {
increment() {
this.count++
}
},
// 生命周期钩子会在组件生命周期的各个不同阶段被调用
// 例如这个函数就会在组件挂载完成后被调用
mounted() {
console.log(`The initial count is ${this.count}.`)
}
}
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
(笔记:这就是vue2所使用的组合式api,template类似与html中的body部分,负责dom主体,script负责事件,style负责样式支持)
组合式 API (Composition API):
通过组合式 API,我们可以使用导入的 API 函数来描述组件逻辑。在单文件组件中,组合式 API 通常会与 <script setup> 搭配使用。这个 setup
attribute 是一个标识,告诉 Vue 需要在编译时进行一些处理,让我们可以更简洁地使用组合式 API。比如,<script setup>
中的导入和顶层变量/函数都能够在模板中直接使用。
下面是使用了组合式 API 与 <script setup>
改造后和上面的模板完全一样的组件:
<script setup>
import { ref, onMounted } from 'vue'
// 响应式状态
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
(笔记:
1:setup:setup类似于一个规则,使下面的分层更加清楚,达到解耦的程度,并且设置初始状态
2:为什么需要导入ref和onMounted :这叫做显式导入,是组合式 API的特点,选项式 API中生命周期钩子都是被定义好了的组件。优势:打包和运行时候只会加载导入的组件,优化代码包,移除未使用的代码,这一过程被称为“树摇”(Tree Shaking)。
3:箭头函数的使用:这是es6+中的新的语法:
作用1:更加简洁的代码表示
原函数:
function increment() {
count.value++
}
去除function 换成const 并转箭头函数:
const increment = () => {
count.value++
};
ps:只有一行喊上课时候可以去除花括号:
const increment = () => count.value++;
作用2:this绑定的固定:
在普通函数中,this
的值由调用上下文决定,但在箭头函数中,this
的值是在定义时就被绑定了,它会捕获定义时所在上下文的 this
值。这意味着箭头函数没有自己的 this
,而是继承自外层的词法作用域。
例子(以及this的用法):
this
关键字在JavaScript中确实是一个常见且重要的概念,但它并不总是指向上一个包含的对象,它的具体含义取决于使用this
的上下文。下面是一些基本的情况来帮助你理解:
1. 在全局作用域中
在全局作用域中,this
通常指向全局对象。在浏览器环境中,全局对象是window
;在Node.js中,则是global
。
console.log(this === window); // true (在浏览器中)
2. 函数调用
当一个函数作为普通函数被调用时,this
通常指向全局对象。
function sayHello() {
console.log(this);
}
sayHello(); // 输出:Window {...} (在浏览器中)
3. 对象的方法
当this
在一个对象的方法中被调用时,this
指向调用该方法的对象。
const obj = {
name: 'Alice',
sayName: function() {
console.log(this.name);
}
};
obj.sayName(); // 输出:"Alice"
4. 构造函数
当使用new
关键字调用一个函数时,this
指向新创建的对象实例。
function Person(name) {
this.name = name;
}
const alice = new Person('Alice');
console.log(alice.name); // 输出:"Alice"
5. 事件处理程序
在事件处理程序中,this
通常指向触发事件的DOM元素。
document.getElementById('myButton').addEventListener('click', function() {
console.log(this.id); // 输出:"myButton"
});
6. 箭头函数
箭头函数没有自己的this
值,它们会捕获外层函数的this
值。
const obj = {
name: 'Alice',
sayName: () => {
console.log(this.name); // 注意这里this可能不是obj
}
};
obj.sayName(); // 可能会输出 `undefined` 或者全局对象的属性
)