Vue3 Day1Day2-Vue3优势ref、reactive函数

news/2024/9/18 20:13:34 标签: vue.js, 前端, javascript

Day1

1.1 Vue3的优势

  • 更容易维护

    1. 组合式API

    2. 更好的TypeScript支持

  • 更快的速度

    1. 重写diff算法

    2. 模板编译优化

    3. 更高效的组件初始化

  • 更小的体积

    1. 良好的TreeShaking

    2. 按需引入

  • 更优的数据响应式

    1. Proxy

setup中不存在this,如果想直接获取节点,就得放在onMounted(一个函数代码) 里面,记得引入它

Day2 ref、reactive

2.1 ref函数

定义:接收简单类型或者复杂类型的数据传入并返回一个响应式的对象

底层原理:如果包裹基本数据类型,底层是函数中的getter和setter;如果包裹引用数据类型,底层是proxy,原理是内部 “ 求助 ” 了Vue3.0中的一个新函数—— reactive函数 这个函数实际就是使用了vue3的响应式原理中的proxy。

ref基本类型用法

<template>
    <div>
        <h1>公主的信息</h1>
        <h2>姓名:{{name}}</h2>
        <h2>年龄:{{age}}</h2>
        <h2 v-for="(item,index) in hobby" :key="index">爱好:{{item}}</h2>
        <button @click="changeAge">年龄增加按钮</button>
    </div>
</template>
​
<script setup>
    import {
        ref
    } from 'vue'
​
    let name = "公主";
    let age = ref(12);
    let hobby = ['美甲', '逛街']
​
    let changeAge = () => {
        // 写法:xxx.value
        age.value++
        console.log('age=>', age);
    }
</script>

ref引用类型用法

<template>
    <div>
        <h1>公主的信息</h1>
        <h2>姓名:{{res.name}}</h2>
        <h2>年龄:{{res.age}}</h2>
        <h2 v-for="(item,index) in hobby" :key="index">爱好:{{item}}</h2>
        <button @click="changeAge">年龄增加按钮</button>
    </div>
</template>
​
<script setup>
    import {
        ref
    } from 'vue'
​
    let res = ref({
        name: '公主',
        age: 12,
    })
​
    let hobby = ['美甲', '逛街']
    let changeAge = () => {
        res.value.age++
        console.log('age=>', res.value.age)
    }
</script>

2.2 reactive函数

定义:接收复杂类型数据的参数传入并返回一个响应式的对象

语法:不需要使用 xxx.value得到想要的值,

注意:

  1. 不能对基本数据类型产生响应性,会出现警告

  2. reactive的丢失响应性以及解决办法

reactive的基本使用

<template>
    <div>
        <h1>公主的信息</h1>
        <h2>姓名:{{res.name}}</h2>
        <h2>年龄:{{res.age}}</h2>
        <h2 v-for="(item,index) in hobby" :key="index">爱好:{{item}}</h2>
        <button @click="changeAge">年龄增加按钮</button>
    </div>
</template>
​
<script setup>
    import {
        reactive
    } from 'vue'
​
    let res = reactive({
        name: '公主',
        age: 12,
    })
​
    let hobby = ['美甲', '逛街']
    let changeAge = () => {
        // 不用 .value这种写法
        res.age++
        console.log('age=>', res.age)
    }
</script>

reactive的响应性

<template>
    <div>
        <h1>公主的信息</h1>
        <h2>姓名:{{res.name}}</h2>
        <h2>年龄(复杂类型的响应性):{{res.a.b.age}}</h2>
        <h2>简单类型的响应性:{{count}}</h2>
        <h2 v-for="(item,index) in hobby" :key="index">爱好:{{item}}</h2>
        <button @click="change">增加按钮</button>
    </div>
</template>
​
<script setup>
    import {
        reactive
    } from 'vue'
​
    let count = reactive(13)
    let res = reactive({
        name: '公主',
        a: {
            b: {
                age: 12,
            }
        }
    })
​
    let hobby = ['美甲', '逛街']
    let change = () => {
        count++ //报出警告
        // 不用 .value这种写法
        // res.a.b.age++   //这个不能和  count++同时出现看效果
    }
</script>

reactive丢失响应性并解决

reactive丢失响应性,引用数据类型的值是存在堆里面,其指针存在栈里面,通过reactive包裹进行赋值(数组,对象,解构),产生新的地址(是一个普通对象),丢失原来响应式对象的引用地址

<template>
    <div>
        <!-- <h1>{{arr}}</h1> -->
        <!-- <h1>{{res.newArr}}</h1> -->
        <h1>{{num}}</h1>
        <h1>{{res}}</h1>
        <button @click="showInfo">按钮</button>
    </div>
</template>
​
<script setup>
    import {
        reactive,
        ref
    } from 'vue'
​
    // 问题:reactive丢失响应性
    // let arr = reactive([])
​
    // let showInfo = () => {
    //  let res = [1, 2, 3, 4, 5, 6]
    //  // reactive 定义数据(必须是对象),是直接调用 reactive 方法处理成响应式对象。
    //  // 如果重新赋值,就会丢失原来响应式对象的引用地址,变成一个新的引用地址,
    //  // 这个新的引用地址指向的对象是没有经过 reactive 方法处理的,所以是一个普通对象,而不是响应式对象。
    //  // 解构同理
    //  arr = res
    //  console.log('arr=>', arr);
    // }
​
    // 解决办法1:不简洁,不推荐
    // let res = reactive({
    //  newArr: []
    // })
    // let showInfo = () => {
    //  let arr = [1, 2, 3, 4, 5, 6]
    //  res.newArr = arr
    //  console.log('res.newArr', res.newArr);
    // }
​
​
    // 解决办法2:ref来解决,推荐
    // let res = ref({
    //  newArr: []
    // })
    // let showInfo = () => {
    //  let arr = [1, 2, 3, 4, 5, 6]
    //  res.value.newArr = arr
    // }
​
​
    // 解决办法3:产生页面更新会触发reactive响应,不推荐
    let res = reactive([])
    let num = ref(1)
    let showInfo = () => {
        let arr = [1, 2, 3, 4, 5, 6]
        num.value++ //ref操作后,页面重新刷新,所以会让reactive产生响应性
        res = arr
    }
</script>

2.3 ref对比reactive

  1. ref和reactive的响应性是深层次的

  2. 基本数据类型或者引用数据类型推荐用ref,引用数据类型推荐用reactive

  3. reactive包裹引用数据类型,不需要用 xxx.value,不能对基本数据类型产生响应性,会出现警告

2.4 ref操作dom节点

<template>
    <div>
        <h1>公主的信息</h1>
        <h2 ref="nling">年龄:{{age}}</h2>
        <h2 v-for="(item,index) in hobby" :key="index">爱好:{{item}}</h2>
        <button @click="change">变化按钮</button>
    </div>
</template>
​
<script setup>
    import {
        ref
    } from 'vue'
​
    let age = ref(12)
    // 推荐这种写法
    let nling = ref()
​
    let hobby = ['美甲', '逛街']
    let change = () => {
        age.value++
        // ref操作dom节点
        nling.value.style.color = '#f60'
    }
</script>
​
<style scoped>
​
</style>

2.5 delete操作符

2.6 父传子静态传值

非语法糖父传子

父组件

<template>
    <div>
        <HelloWorld name="白泽" school="观音大士学府"></HelloWorld>
    </div>
</template>
​
<script>
    import HelloWorld from './components/HelloWorld.vue'
    export default {
        setup() {
​
        },
        components: {
            HelloWorld
        }
    }
</script>

子组件

<template>
    <h1>{{ name }}</h1>
    <h1>{{ school }}</h1>
​
</template>
​
<!-- setup取代了export default -->
<script>
    export default {
        props: ['name', 'school'],
        setup() {
​
        }
    }
</script>
​
<style scoped>
    .read-the-docs {
        color: #888;
    }
</style>

语法糖父传子

父组件

<template>
	<div>
		<HelloWorld name="白泽" school="观音大士学府"></HelloWorld>
		<!-- <HelloWorld school="观音大士学府"></HelloWorld> -->
	</div>
</template>

<script setup>
	import HelloWorld from './components/HelloWorld.vue'
</script>

子组件

<template>
    <h1>{{ name }}</h1>
    <h1>{{ school }}</h1>
    <button @click="print">打印按钮</button>
</template>
​
<!-- setup取代了export default -->
<script setup>
    // 接收父组件传过来的数据
    // 写法1:
    // defineProps(['name', 'school'])
​
    // 写法2:
    // defineProps({
    //  name: String,
    //  school: String
    // })
​
    // 写法3:
    // defineProps({
    //  name: {
    //      type: String,
    //      default: '哪吒'
    //  },
    //  school: String
    // })
​
    // 写法4:
    let res = defineProps(['name', 'school']) //只读,不可修改或添加
    let print = () => {
        console.log('res=>', res); //props接收的值是静态的,当父组件传动态的值的时候,props是拿不到的,只能通过watch进行监听
    }
</script>
​
<style scoped>
    .read-the-docs {
        color: #888;
    }
</style>

2.7 delete操作符


http://www.niftyadmin.cn/n/5659618.html

相关文章

Pyorch中 nn.Conv1d 与 nn.Linear 的区别

即一维卷积层和全联接层的区别 nn.Conv1d 和 nn.Linear 都是 PyTorch 中的层&#xff0c;它们用于不同的目的&#xff0c;主要区别在于它们处理输入数据的方式和执行的操作类型。 nn.Conv1d 通过应用滑动过滤器来捕捉序列数据中的局部模式&#xff0c;适用于处理具有时间或序列…

消息中间件有哪些常见类型

消息中间件根据其设计理念和用途&#xff0c;可以大致分为以下几种常见类型&#xff1a; 点对点消息队列&#xff08;Point-to-Point Messaging Queues&#xff09;&#xff1a; 在这种模型中&#xff0c;消息被发送到特定的队列中&#xff0c;消费者从队列中取出并处理消息。队…

Qt_按钮类控件

目录 1、QAbstractButton 2、设置带图标的按钮 3、设置带有快捷键的按钮 4、QRadioButtion&#xff08;单选按钮&#xff09; 4.1 QButtonGroup 5、QCheckBox 结语 前言&#xff1a; 按钮类控件是Qt中最重要的控件类型之一&#xff0c;该类型的控件可以通过鼠标的点击…

分类预测|基于蜣螂优化随机森林的数据分类预测Matlab程序DBO-RF 多特征输入多类别输出 含基础RF程序

分类预测|基于蜣螂优化随机森林的数据分类预测Matlab程序DBO-RF 多特征输入多类别输出 含基础RF程序 文章目录 一、基本原理**原理****DBO-RF 流程****总结** 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 DBO-RF 结合了蜣螂优化算法&#xff08;Dung Beetle O…

第十六节:学习Springboot 的自定义资源路径(自学Spring boot 3.x的第四天)

这节记录下如何访问自定义资源路径。 默认的资源访问路径为static。 比如要访问static下面的123.jpg&#xff0c;访问的时候直接localhost/123.jgp既可&#xff0c;不需要加static前缀。 但是如果要访问static以外的自定义资源路径时候就需要配置了。 如何配置呢&#xff1…

PostgreSQL LSN 详解及转换工具

LSN 是什么 LSN (Log sequence number) &#xff0c;即日志序列号。每一条 WAL 日志都需要一个编号来标识它&#xff0c;而 LSN 就可以看作是 WAL 日志不断自增的编号。 LSN 格式 我们使用 pg_waldump 打印一段 WAL 日志&#xff0c;LSN 如下图所示。 PG 的 LSN 是 64 位无…

【测试报告】博客系统

1.项目背景 在互联网高度发达的今天,越来越多的人开始学习编程,诞生了越来越多的程序员,但他们没有可以互相交流学习、分享经验的平台。本项目旨在为更多的程序员以及新手小白提供一个能够促进学习、共同进步&#xff0c;让小白也能成为大神的交流学习平台 1.1测试目标以及测试…

循环神经网络RNN+长短期记忆网络LSTM 学习记录

循环神经网络&#xff08;RNN) RNN的的基础单元是一个循环单元&#xff0c;前部序列的信息经处理后&#xff0c;作为输入信息传递到后部序列 x为输入向量&#xff0c;y为输出向量&#xff0c;a为上一隐藏层的a与x通过激活函数得到的值&#xff0c;简言之&#xff0c;每一层神…