目录
Vue3核心语法
OptionsAPI 与 CompositionAPI
setup函数
setup 概述
setup 语法糖
ref 创建:基本类型的响应式数据
reactive 创建:对象类型的响应式数据
ref 创建:对象类型的响应式数据
ref 对比 reactive
toRefs 与 toRef
computed
watch
情况一:监视 ref 定义的基本类型数据
情况二:监视 ref 定义的对象类型数据
情况三:监视 reactive 定义的对象类型数据
情况四:监视 ref 或 reactive 定义的对象类型数据中的某个属性
情况五:监视多个数据
Vue.js 是一个流行的前端 JavaScript 框架,它提供了两种不同的 API 风格来编写组件:Options (选项式)API 和 Composition(组合式) API。
1、Options API:
Options API 是 Vue.js 最初提供的 API 风格。在 Options API 中,你通过创建一个包含不同属性的对象来定义组件。这些属性可以包括 data、methods、computed、watch、props 等。每个属性都有其特定的作用,比如 data 用于定义组件的数据,methods 用于定义组件的方法,computed 用于定义计算属性等。
// Options API 示例
export default {
data() {
return {
message: 'Hello, Vue!'
};
},
methods: {
greet() {
alert(this.message);
}
}
};
2、Composition API:
Composition API 是 Vue.js 3.0 引入的新的 API 风格。与 Options API 不同,Composition API 允许你使用函数来组织你的代码,而不是将所有相关逻辑分散在不同的选项中。使用 Composition API,你可以将相关代码放在一起,并且可以更灵活地重用逻辑。
// Composition API 示例
import { ref, computed } from 'vue';
export default {
setup() {
const message = ref('Hello, Vue!');
function greet() {
alert(message.value);
}
return {
message,
greet
};
}
};
主要区别:
setup 函数是 Vue 3 中的一个新的配置项,它是 Composition API 的入口点,用于配置组件内部所需的数据、方法、计算属性、监视等逻辑。
以下是关于 setup 函数的概述:
总的来说,setup 函数作为 Composition API 的入口点,为 Vue 3 的组件开发提供了更强大的能力和更清晰的代码结构,使得开发者可以更好地管理组件内部的状态和行为。
在 Vue 3 中,有一种称为“语法糖”的特性,可以简化使用 setup 函数的过程,这就是
扩展:上述代码,还需要编写一个不写`setup`的`script`标签,去指定组件名字,比较麻烦,我们可以借助`vite`中的插件简化 第一步:npm i vite-plugin-vue-setup-extend -D 第二步:打开vite.config.ts 第三步: 1、作用: 定义响应式变量,这意味着当变量的值发生变化时,相关的视图会自动更新。 2、语法: 使用 let xxx = ref(初始值) 来创建一个响应式变量,其中 xxx 是变量名,初始值 是变量的初始值。 3、返回值: ref 函数返回一个 RefImpl 实例对象,简称为 ref对象 或 ref。该对象具有一个 value 属性,该属性是响应式的,即当 value 发生变化时,相关的视图会进行更新。 4、注意点: 扩展一下:推荐一个vscode的一个设置,设置后vscode会自动帮你.value 第一步:打开vscode的设置 第二步:点击扩展,找到volar 第三步:将下图的选项勾选上 例子: 1、作用: reactive 函数用于定义一个响应式对象,即当对象的属性发生变化时,相关的视图会自动更新。需要注意的是,应该将 reactive 用于对象类型的数据,而不是基本类型的数据,对于基本类型的数据应该使用 ref。 2、语法: 使用 let 响应式对象 = reactive(源对象) 来创建一个响应式对象,其中 响应式对象 是你想要创建的响应式对象的变量名,源对象 是你想要转换为响应式对象的普通 JavaScript 对象。 3、返回值: reactive 函数返回一个 Proxy 的实例对象,这个实例对象就是我们所说的响应式对象,它会拦截对对象的操作,使得这些操作变得响应式。 4、注意点: 使用 reactive 定义的响应式数据是“深层次”的,这意味着如果对象的嵌套属性发生变化,相关的视图也会更新。 例子: 姓名:{{ student.name }} 年龄:{{ student.age }} 性别:{{ student.gender }} 在 Vue 中,ref 函数不仅可以用于创建基本类型的响应式数据,还可以用于创建对象类型的响应式数据。实际上,如果将对象传递给 ref 函数,内部会自动调用 reactive 函数来将对象转换为响应式对象。 这种用法的好处是,无需手动调用 reactive 函数,而是直接使用 ref 函数来统一管理基本类型和对象类型的响应式数据。 例子: 姓名:{{ student.name }} 年龄:{{ student.age }} 性别:{{ student.gender }} 用途: 区别: 使用原则: 总的来说,ref 更适合用于管理基本类型的响应式数据以及浅层次的对象类型数据,而 reactive 则更适合用于管理深层次的对象类型数据。 toRefs 和 toRef 是 Vue 3 提供的两个工具函数,用于处理响应式对象和 ref 对象之间的转换。 toRefs toRef 比较 使用时,如果需要批量转换多个属性,可以使用 toRefs;如果只需要转换一个属性,可以使用 toRef。 例子: 计算: {{ state.count }} 名字: {{ state.name }} computed 是 Vue.js 中的一个计算属性(和`Vue2`中的`computed`作用一致),它可以根据响应式数据动态计算出一个新的值,并且在依赖的响应式数据发生变化时自动更新。 例子: watch 在 Vue 3 中用于监视数据的变化,其功能与 Vue 2 中的 watch 类似。在 Vue 3 中,watch 只能监视四种类型的数据:ref 定义的数据、reactive 定义的数据、函数返回的值、以及一个包含上述内容的数组。下面是几种常见的使用情况: 监视 ref 定义的【基本类型】数据:直接写数据名即可,监视的是其`value`值的改变。 监视 ref 定义的【对象类型】数据:直接写数据名,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视(deep: true)。 注意: 监视 reactive 定义的【对象类型】数据,且默认开启了深度监视。 监视 ref 或 reactive 定义的【对象类型】数据中的 某个属性,注意点如下: 1. 若该属性值不是【对象类型】,需要写成函数形式。 结论:监视的要是对象里的属性,那么最好写函数式,注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视(deep: true)。import { defineConfig } from 'vite'
import VueSetupExtend from 'vite-plugin-vue-setup-extend'
export default defineConfig({
plugins: [ VueSetupExtend() ]
})
ref 创建:基本类型的响应式数据
姓名:{{name}}
年龄:{{age}}
性别: {{ sex }}
reactive 创建:对象类型的响应式数据
学生信息
ref 创建:对象类型的响应式数据
学生信息
ref 对比 reactive
toRefs 与 toRef
computed
名:
全名:{{ fullName }}
watch
情况一:监视 ref 定义的基本类型数据
import { ref, watch } from 'vue';
const count = ref(0);
watch(count, (newValue, oldValue) => {
console.log('count 值发生变化:', newValue, oldValue);
});
情况二:监视 ref 定义的对象类型数据
import { ref, watch } from 'vue';
const person = ref({ name: 'John', age: 30 });
// 监视对象的地址值
watch(person, (newValue, oldValue) => {
console.log('person 对象的地址值发生变化:', newValue, oldValue);
});
// 监视对象内部属性的变化,手动开启深度监视
watch(person, (newValue, oldValue) => {
console.log('person 对象内部属性发生变化:', newValue, oldValue);
}, { deep: true });
情况三:监视 reactive 定义的对象类型数据
import { reactive, watch } from 'vue';
const person = reactive({ name: 'John', age: 30 });
// 默认开启了深度监视
watch(person, (newValue, oldValue) => {
console.log('person 对象的地址值发生变化:', newValue, oldValue);
});
情况四:监视 ref 或 reactive 定义的对象类型数据中的某个属性
2. 若该属性值是依然是【对象类型】,可直接编,也可写成函数,建议写成函数。import { ref, reactive, watch } from 'vue';
const person = ref({ name: 'John', age: 30 });
// 监视属性值不是对象类型,写成函数形式
watch(() => person.value.age, (newValue, oldValue) => {
console.log('person 对象的 age 属性发生变化:', newValue, oldValue);
});
// 监视属性值仍然是对象类型,可直接编,也可写成函数,建议写成函数
watch(person.value, (newValue, oldValue) => {
console.log('person 对象内部属性发生变化:', newValue, oldValue);
});
// 或者使用深度监视
watch(person, (newValue, oldValue) => {
console.log('person 对象内部属性发生变化:', newValue, oldValue);
}, { deep: true });
情况五:监视多个数据
import { ref, watch } from 'vue';
const count = ref(0);
const name = ref('John');
watch([count, name], ([countValue, nameValue], [oldCountValue, oldNameValue]) => {
console.log('count 和 name 值发生变化:', countValue, nameValue, oldCountValue, oldNameValue);
});