• Vue.js入门教程(八)


    目录

    Vue3

    优点

    Vue脚手架 Vue CLI 创建一个Vue3的项目

    1:安装脚手架

    2:创建一个项目

    3:Vue初始项目文件

    main.js

    App.vue

    Vue3的Composition API

    setup 函数

    setup 的参数

            参数:props

            参数:context

    ref 函数

    reactive 函数

    ref 和 reactive 的区别

    setup 的 computed 函数

    setup 的 watch函数

    setup 的 watchEffect 函数

    setup 的 toRef 函数

    setup 的 toRefs 函数

    Vue3中的生命周期函数

    多层嵌套组件之间的通讯


    Vue3

    优点

    • 更小的打包体积和内存
    • 更好的支持 TypeScript
    • 页面第一次的渲染速度和更新速度更快
    • 新增了 Composition API 和内置组件

    Vue脚手架 Vue CLI 创建一个Vue3的项目

    1:安装脚手架

    npm install -g @vue/cli

    Node 版本要求
    Vue CLI 4.x 需要 Node.js v8.9 或更高版本 (推荐 v10 以上)。你可以使用 n,nvm 或 nvm-windows 在同一台电脑中管理多个 Node 版本。

    2:创建一个项目

    vue create hello-vue3

    报错:vue : 无法加载文件xxx 因为在此系统上禁止运行脚本

    解决:以管理员身份运行VS Code,在终端输入 set-ExecutionPolicy RemoteSigned 即可。

    使用 vue -V 查看 Vue CLI版本

    vue -V

    选择  Vue 3 

    然后

    cd hello-vue3

    npm run serve

    打开网页 http://localhost:8080。这样一个 Vue3 脚手架项目就创建完成了

    3:Vue初始项目文件

    • main.js

    整个项目的入口文件

    • App.vue

    所有⼦组件的⽗组件


    Vue3的Composition API

    • setup 函数

    • setup 函数是Vue3新的配置项
    • 是使用组合API的前提,数据、方法都要放到 setup 函数里声明
    • 在生命周期函数 beforeCreate 之前执行一次,而且 setup 函数没有 this
    1. <script>
    2. export default {
    3. setup() { // setup函数,里面使用 js 原生语法
    4. let name = '张三';
    5. let age = 18;
    6. function hello () {
    7. alert(`你好,我是${name},今年${age}岁了`);
    8. }
    9. return { // vue 中要使用 setup 里定义的变量、函数的话,需要把变量、函数 return 出去
    10. name,
    11. age,
    12. hello
    13. }
    14. }
    15. }
    16. script>
    • setup 的参数

            参数:props

    用于接收父组件的值

            参数:context

    上下文对象,触发自定义事件

            父组件代码

    1. <script>
    2. import HelloWorld from './components/HelloWorld.vue'
    3. export default {
    4. components: {
    5. HelloWorld
    6. },
    7. setup() {
    8. // 自定义事件回调
    9. function handleDianji(value) {
    10. console.log("打印子组件传过来的值=", value);
    11. }
    12. return {
    13. handleDianji
    14. }
    15. }
    16. }
    17. script>

            子组件代码

    1. <script>
    2. export default {
    3. emits: ["dj"], // 声明自定义事件
    4. setup(props, context) {
    5. function dianji() {
    6. context.emit("dj", "我是子组件的值"); // 触发自定义事件
    7. }
    8. return {
    9. dianji
    10. }
    11. }
    12. }
    13. script>

    • ref 函数

    实现数据的响应式        // setup定义的变量数据,如果想通过setup中定义的函数改变数据是没有作用的。这里就要用到 ref 函数改变数据

    • 可以处理基本类型数据、数组或者对象类型的数据
    • 基本类型数据的响应式是通过 Object.defineProperty() 实现
    • 对象类型数据的响应式是通过 ES6 中的 Proxy 实现
    1. <script>
    2. import { ref } from "vue"; // 引入 ref 函数
    3. export default {
    4. setup() {
    5. let name = ref("张三"); // ref 操作基本数据类型
    6. let age = ref(18);
    7. let obj = ref({ // ref 操作对象
    8. sex: "man"
    9. });
    10. function hello() {
    11. alert(`你好,我是${name.value},今年${age.value}岁了, 性别${obj.value.sex}`);
    12. }
    13. function changePreson() {
    14. name.value = "李四";
    15. age.value = "20";
    16. obj.value.sex = "female"
    17. }
    18. return {
    19. name,
    20. age,
    21. obj,
    22. hello,
    23. changePreson
    24. }
    25. }
    26. }
    27. script>

    • reactive 函数

    定义一个对象类型的响应式数据(不能处理基本类型数据)

    1. <script>
    2. import { ref, reactive } from "vue"; // 引入 ref 函数
    3. export default {
    4. setup() {
    5. let name = ref("张三"); // ref 操作基本数据类型
    6. let age = ref(18);
    7. let obj = reactive({ // reactive 操作对象
    8. sex: "man"
    9. });
    10. function hello() {
    11. alert(`你好,我是${name.value},今年${age.value}岁了, 性别${obj.sex}`);
    12. }
    13. function changePreson() {
    14. name.value = "李四";
    15. age.value = "20";
    16. obj.sex = "female"
    17. }
    18. return {
    19. name,
    20. age,
    21. obj,
    22. hello,
    23. changePreson
    24. }
    25. }
    26. }
    27. script>

    • ref 和 reactive 的区别

    • 处理数据类型不同:ref 可以处理基本类型和对象(数组)类型数据, reactive 只能处理对象(数组)类型数据
    • 实现原理不同:ref 处理基本类型数据通过 Object.defineProperty() 实现, reactive 通过Proxy 实现
    • 操作不同: ref 操作数据需要加 .value

    • setup 的 computed 函数

    1. <script>
    2. import { ref, computed } from "vue";
    3. export default {
    4. setup() {
    5. let firstName = ref("张");
    6. let lastName = ref("三");
    7. let fullName = computed({
    8. get() {
    9. return firstName.value + "-" + lastName.value;
    10. },
    11. set(value) {
    12. const arr = value.split("-");
    13. firstName.value = arr[0];
    14. lastName.value = arr[1];
    15. }
    16. })
    17. return {
    18. firstName,
    19. lastName,
    20. fullName
    21. }
    22. }
    23. }
    24. script>

    • setup 的 watch函数

    1. <script>
    2. import { ref, watch } from "vue";
    3. export default {
    4. setup() {
    5. let numa = ref(1);
    6. let numb = ref(1);
    7. watch([numa, numb], (newValue, oldValue) => {
    8. console.log("numa或者numb变化了", newValue, oldValue);
    9. }, { immediate: true, deep: true });
    10. return {
    11. numa,
    12. numb
    13. };
    14. },
    15. };
    16. script>

    监听对象

    1. watch(numObj, (newValue, oldValue) => {
    2. console.log("numObj变化了", newValue, oldValue);
    3. })

    监听对象中的一个基本类型属性

    1. watch(
    2. () => numObj.a,
    3. (newValue, oldValue) => {
    4. console.log("numObj变化了", newValue, oldValue);
    5. }
    6. );

    监听对象中的一些基本类型属性

    1. watch([() => numObj.a, () => numObj.b], (newValue, oldValue) => {
    2. console.log("numObj变化了", newValue, oldValue);
    3. });

    监听对象中的对象属性类型

    1. watch(
    2. numObj.c,
    3. (newValue, oldValue) => {
    4. console.log("numObj.c变化了", newValue, oldValue);
    5. }
    6. );
    • ref 定义的数据
      • 基本类型数据作为监听值
      • 对象作为监听值,需要加 .value (⽤的少)
    • reactive 定义的数据
      • 对象作为监听值
      • 属性作为监听值,需要放在回调函数中
    • 如果监听 reactive 定义的对象,则无法正确输出 oldValue ,且深度监听是强制开启的,无法关闭 (vue3配置)

    在监听的回调函数中使⽤了属性,则监听该属性,不⽤在参数上指明监听哪个属性

    • setup 的 toRef 函数

    创建一个 ref 对象,其 value 值指向另一个对象中指定的属性        // 相当于起了个别名

    1. <script>
    2. import { reactive, toRef} from "vue";
    3. export default {
    4. setup() {
    5. let data = reactive({
    6. name: "张三"
    7. });
    8. let aliasName = toRef(data, "name"); // 相当于 把data的name属性定义了一个别名
    9. return {
    10. data,
    11. aliasName,
    12. }
    13. }
    14. };
    15. script>
    • setup 的 toRefs 函数

    批量创建 ref 对象,其 value 值指向另一个对象        // 相当于批量起别名

    1. <script>
    2. import { reactive, toRefs} from "vue";
    3. export default {
    4. setup() {
    5. let data = reactive({
    6. name: "张三",
    7. age: 18
    8. });
    9. return {
    10. ...toRefs(data)
    11. }
    12. }
    13. };
    14. script>

    Vue3中的生命周期函数


    多层嵌套组件之间的通讯

    • provide:祖组件使用此函数传递数据
    • inject:后代组件使用此函数接收数据
    1. // 上级组件代码
    1. // 下级(多层下级都可以)组件代码

  • 相关阅读:
    Idea Git 已提交代码版本回滚
    详解MySQL隔离级别
    学习提高:Mac Pro下安装MongoDB,MongoDB远程连接并执行命令
    Informatica使用操作流程--聚合、表达式转换、查找、排序组件的使用 案例3
    Zookeeper
    用go封装一下封禁功能
    iPhone 15秋季发布会召开,媒介盒子多家媒体持续报道
    Airtest:各平台的剪切板功能汇总
    异地容灾系统和数据仓库系统设计和体系结构
    虚拟化技术课程实践
  • 原文地址:https://blog.csdn.net/a1053765496/article/details/126819223