Vue3中Setup概述和使用(三)

一、引入Setup

1、Person.Vue

与Vue3编写简单的App组件(二) 中的区别是:取消data、methods等方法,而是将数据和方法定义全部放进setup中。

<template>
    <div class="person">
        <h1>姓名:{{name}}</h1>
        <h1>年龄:{{age}}</h1>
        <button :onclick="changeName">修改姓名</button>
        <button :onclick="changeAge">修改年龄</button>
        <button :onclick="showTel">查看电话</button>
    </div>


</template>

<script lang="ts">
    export default {
        name: 'Person',
        setup() {
            console.log(this) //setup中的this是undefined,vue3中弱化了this
            let name = "Maple" //变量还不是响应式,所以变量值变更并不会使页面发生同步变化
            let age = 28
            let tel = 13943232232

            function changeName() {//注意:这样修改,虽然name值确实修改了,但页面不会有变化(下同)
                name = "Kelly" //此时Kelly
            }

            function changeAge() {
                age += 1
            }

            function showTel() {
                alert(tel)
            }
            // 需要返回,template中才能够读取到数据
            return { name, age, tel, changeName, changeAge, showTel }
        }
    }
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

2、App.Vue

<template>
    <!-- 写html -->
    <h1>我是Maple:</h1>
    <div class="app">
        <Person />
    </div>

</template>

<script lang="ts">

    import Person from './components/Person.vue'
    // 写js或者ts
    export default {
        name: 'App', //组件名
        components: { Person }
    }
</script>

<style>
    /* 写样式 */
    .app {
        background-color: #ddd;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
</style>

3、页面效果

注意:此时`修改姓名`和`修改年龄`按钮并不会生效,因为数据还不是响应式的。

二、Setup语法糖

以上方式中,在Setup中定义的变量和方法需要return出去,才能够被模板引用,如果变量和方法过多,就会比较繁琐,由此引入setup语法糖

 Person.vue文件完整源码

<template>
    <div class="person">
        <h1>姓名:{{name}}</h1>
        <h1>年龄:{{age}}</h1>
        <button :onclick="changeName">修改姓名</button>
        <button :onclick="changeAge">修改年龄</button>
        <button :onclick="showTel">查看电话</button>
    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    let name = "Maple"
    let age = 28
    let tel = 13943232232

    function changeName() {
        name = "Kelly"
    }

    function changeAge() {
        age += 1
    }

    function showTel() {
        alert(tel)
    }
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

三、ref和reactive实现响应式数据

1、ref基本类型响应式数据使用

适用对象:基本数据类型,使用步骤如下:

(1) 引入ref

 import {ref} from 'vue'

(2) 使用ref修饰数据

let name = ref('Maple')

(3) 调用变量并修改数据

# 注意要加value,才能够获取变量(被包装之后的)对应的值
name.value == 'Maple'

Person.vue完整代码如下:

<template>
    <div class="person">
        <h1>姓名:{{name}}</h1>
        <h1>年龄:{{age}}</h1>
        <button :onclick="changeName">修改姓名</button>
        <button :onclick="changeAge">修改年龄</button>
        <button :onclick="showTel">查看电话</button>
    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { ref } from 'vue'

    //2.然后使用ref
    let name = ref('Maple')
    let age = ref(28)
    let tel = 13943232232

    function changeName() {
        //3.注意要加value,才能够获取变量(被包装之后的)对应的值
        if (name.value == 'Maple') {
            name.value = 'Kelly'
        } else {
            name.value = 'Maple'
        }

    }

    function changeAge() {
        age.value += 1
    }

    function showTel() {
        alert(tel)
    }
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

2、ref对象类型响应式数据使用

适用对象:ref同时支持对象类型的响应式

<template>
    <div class="person">
        <h1>电脑信息:</h1>
        <h1>电脑品牌:{{computer.brand}}</h1>
        <h1>电脑价格:{{computer.price}}</h1>

        <h1>学生信息:</h1>
        <ul>
            <li v-for="item in students" :key="item.name">{{item.age}}</li>
        </ul>
        <!-- 修改电脑价格 -->
        <button :onclick="changePrice">修改电脑价格</button>
        <!-- 修改第一个学生的年龄 -->
        <button :onclick="changeAge">修改学生年龄</button>

    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { ref } from 'vue'

    //2.然后使用ref
    let computer = ref({ brand: 'hp', price: 5500 })
    let students = ref([
        { name: 'Maple', age: 30 },
        { name: 'Kelly', age: 35 },
        { name: 'Max', age: 12 }
    ])


    function changePrice() {
        //需要通过value取值
        computer.value.price = 5000
    }

    function changeAge() {
        //需要通过value取值
        students.value[0].age = 44
    }


</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

3、reactive使用

适用对象:只支持对象类型数据,使用步骤如下:

(1) 引入reactive

import { reactive } from 'vue'

(2) 使用reactive修饰数据

let computer = reactive({ brand: 'hp', price: 5500 })

(3) 修改数据

 computer.price = 5000

  Person.vue文件完整源码

<template>
    <div class="person">
        <h1>电脑品牌:{{computer.brand}}</h1>
        <h1>电脑价格:{{computer.price}}</h1>
        <ul>
            <li v-for="item in students" :key="item.name">{{item.age}}</li>
        </ul>
        <!-- 修改电脑价格 -->
        <button :onclick="changePrice">修改电脑价格</button>
        <!-- 修改第一个学生的年龄 -->
        <button :onclick="changeAge">修改学生年龄</button>
        <!-- 修改歌手姓名 -->
        <button :onclick="ChangeSinger">修改歌手姓名</button>
    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { reactive } from 'vue'

    //2.然后使用ref
    let computer = reactive({ brand: 'hp', price: 5500 })
    let students = reactive([
        { name: 'Maple', age: 30 },
        { name: 'Kelly', age: 35 },
        { name: 'Max', age: 12 }
    ])

    let singer = {
        a: {
            b: {
                c: 'Jay'
            }
        }
    }


    function changePrice() {
        computer.price = 5000
    }

    function changeAge() {
        students[0].age = 44
    }

    function ChangeSinger() {
        singer.a.b.c = '毛不易'
    }
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

4、ref和reactive的区别

(1)ref支持基本类型对象类型数据;reactive仅支持对象类型数据

(2)ref获取变量值需要使用.value,而reactive直接通过变量获取

(3)针对对象的一次性修改,两者方式不一样,具体可参照如下案例:

<template>
    <div class="person">
        <h1>电脑信息:</h1>
        <h1>电脑品牌:{{computer.brand}}</h1>
        <h1>电脑价格:{{computer.price}}</h1>

        <h1>学生信息:</h1>
        <ul>
            <li v-for="item in students" :key="item.name">{{item.name}}:{{item.age}}</li>
        </ul>
        <!-- 修改电脑 -->
        <button :onclick="changeComputer">修改电脑</button>
        <!-- 修改学生 -->
        <button :onclick="changeStudents">修改学生</button>

    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { ref, reactive } from 'vue'

    //2.然后使用ref和reactive
    let computer = ref({ brand: 'hp', price: 5500 })
    let students = reactive([
        { name: 'Maple', age: 30 },
        { name: 'Kelly', age: 35 },
        { name: 'Max', age: 12 }
    ])


    function changeComputer() {

        //ref修饰对象,可以通过以下方式直接替换computer
        computer.value = { brand: 'HTC', price: 600 }
    }

    function changeStudents() {
        // students = {name:'Jacky',age:50} //这么写页面不更新的
        // students = reactive({name:'Jacky',age:50}) //这么写页面不更新的,因为此时students已经是一个新对象

        // reactive 修饰对象,下面这个写法页面可以实现更新
        Object.assign(students, [{ name: 'Jacky', age: 50 }, { name: 'Kitty', age: 20 },
        { name: 'Lily', age: 22 }])
    }

</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

5、to_refs和to_ref

<template>
    <div class="person">
        <h1>电脑信息:</h1>
        <h1>电脑品牌:{{computer.brand}}</h1>
        <h1>电脑价格:{{computer.price}}</h1>

        <h1>个体信息</h1>
        <h1>姓名:{{person.name}}</h1>
        <h1>年龄{{person.age}}</h1>

        <!-- 修改电脑 -->
        <button :onclick="changeComputer">修改电脑</button>
        <!-- 修改姓名 -->
        <button :onclick="changeName">修改学生姓名</button>


    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { reactive, toRefs, toRef } from 'vue'

    //2.然后使用reactive
    let computer = reactive({ brand: 'hp', price: 5500 })

    // 使用toRefs从computer这个响应式对象中,解构出brand、price,且brand和price依然是响应式的
    // brand和price的值是ref类型,其value值指向的是computer.brand和computer.price
    let { brand, price } = toRefs(computer)
    let person = reactive({ name: 'maple', age: 30 })

    // 使用toRef从person这个响应式对象中,解构出name,且name依然是响应式的
    let name = toRef(person, 'name')


    // 修改电脑信息
    function changeComputer() {
        brand.value = 'HTC'
        price.value = '8000'
    }

    // 修改个人姓名
    function changeName() {
        name.value = 'Avery'
    }
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/383266.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统基础(九):Linux用户与权限

文章目录 Linux用户与权限 一、文件权限概述 二、终端命令&#xff1a;组管理 三、终端命令&#xff1a;用户管理 1、创建用户 、 设置密码 、删除用户 2、查看用户信息 3、su切换用户 4、sudo 4.1、给指定用户授予权限 4.2、使用 用户 zhangsan登录, 操作管理员命令…

【开源】SpringBoot框架开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

字节跳动官方出品AI,白嫖使用GPT4!

关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部专家博主&#xff0c;编程严选网创始人。具有丰富的引领团队经验&#xff0c;深厚业务架…

Matplotlib核心:掌握Figure与Axes

详细介绍Figure和Axes&#xff08;基于Matplotlib&#xff09; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333; 一、Figure&#xff08;图形&#xff09;&#x1f333;&#x1f341;1. 创建Figure&#x1f341;&#x1f341;2. 添加Axes&am…

Linux笔记之xhost +和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解

Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解 ——2024-02-11 code review! 文章目录 Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解xhost 的作用xhost 与 Docker 的关系 -e GDK_SCALE 和 -e GDK_DPI_SCALE详解GDK_SCALEGDK_DPI_SC…

8种基本类型的包装类(与String的转换)

java针对8种基本数据类型&#xff0c;定义了相应的引用类型&#xff1a;包装类(封装类)&#xff0c;有了类的特点&#xff0c;就能调用类中的方法&#xff0c;java才是真正的面向对象。 基本数据类型 包装类byte Byteshort Shortint Integerlong Longfloat Floa…

操作系统——内存管理(附带Leetcode算法题LRU)

1.内存管理主要用来干什么&#xff1f; 操作系统的内存管理主要负责内存的分配与回收、内存扩充(虚拟技术)、地址转换(逻辑-物理)、内存保护(保证各进程在自己的内存空间运行&#xff0c;不会越界访问)..... 2.什么是内存碎片&#xff1f; 内存碎片是内存的申请和释放产生的…

C#,纽曼-尚克斯-威廉士素数(Newman Shanks Williams prime)的算法与源代码

1 NSW素数 素数是纽曼-尚克斯-威廉士素数&#xff08;Newman-Shanks-Williams prime&#xff0c;简写为NSW素数&#xff09;当且仅当它能写成以下的形式&#xff1a; 1981年M. Newman、D. Shanks和H. C. Williams在研究有限集合时&#xff0c;率先描述了NSW素数。 首几个NSW素…

LeetCode Python - 9.回文数

文章目录 题目答案运行结果 题目 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&am…

CentOS在VMWare中扩容

1.相关概念 物理卷&#xff1a;简称PV&#xff0c;逻辑卷管理中处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘&#xff0c;一块硬盘&#xff0c;或多块硬盘&#xff0c;如/dev/sdb。 卷组&#xff1a;简称VG&#xff0c;建立在物理卷之…

解决 postman测试接口报404 Not Found

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 问题描述原因分析解决方案 问题描述 当我使用postman测试接口时&#xff0c;报了 404 Not Found 的错误&#xff0c;报错截图如下所示 但我的后端程序中已经定义了该接口&#xff0c;如下所示 …

视频直播系统架构的设计与实现

视频直播系统作为一种实时性强、用户互动性高的应用&#xff0c;其架构设计至关重要。本文将介绍如何设计和实现一个稳定、高性能的直播系统架构&#xff0c;以提供良好的用户体验和可靠的服务。 1. 系统架构概述 - 介绍视频直播系统的整体架构&#xff0c;包括客户端、服务…

Java安全 CC链1分析(Lazymap类)

Java安全 CC链1分析 前言CC链分析CC链1核心LazyMap类AnnotationInvocationHandler类 完整exp&#xff1a; 前言 在看这篇文章前&#xff0c;可以看下我的上一篇文章&#xff0c;了解下cc链1的核心与环境配置 Java安全 CC链1分析 前面我们已经讲过了CC链1的核心ChainedTransf…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

网络安全工程师技能手册(附学习路线图)

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 安全是互联网公司的生命&#xff0c;也是每位网民的基本需求。现在越来越多的人对网络安全感兴趣&#xff0c;愿意投奔到网络安全事业之中&#xff0c;这是一个很好的现象。 很多对网络安全感…

Leetcode2842. 统计一个字符串的 k 子序列美丽值最大的数目

Every day a Leetcode 题目来源&#xff1a;2842. 统计一个字符串的 k 子序列美丽值最大的数目 解法1&#xff1a;哈希 数学 提示&#xff1a; 统计每个字符出现次数的个数&#xff0c;然后从大到小遍历次数 c 及其个数 num。 所有方案数相乘即为答案。 如果 k 太大&#…

【大厂AI课学习笔记】【1.6 人工智能基础知识】(4)深度学习和机器学习

关于深度学习和机器学习&#xff0c;出来包含关系之外&#xff0c;还有如上总结的知识点。 分别从特征处理、学习方法、数据依赖、硬件依赖等4个方面&#xff0c;进行了总结。 从特征处理上看&#xff1a;深度学习从数据中习得高级特征&#xff0c;并自行创建新的特征。这比普…

【AI绘图】初见·小白入门stable diffusion的初体验

首先&#xff0c;感谢赛博菩萨秋葉aaaki的整合包 上手 stable diffusion还是挺好上手的&#xff08;如果使用整合包的话&#xff09;&#xff0c;看看界面功能介绍简单写几个prompt就能生成图片了。 尝试 我在网上找了一张赛博朋克边缘行者Lucy的cos图&#xff0c;可能会侵…

[ai笔记3] ai春晚观后感-谈谈ai与艺术

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第3篇分享&#xff01; 今天我们不聊技术&#xff0c;只聊感受&#xff01; 1 关于ai春晚 期待许久的ai春晚&#xff0c;但是等初一晚上观看的时候&#xff0c;或多或少还是有些失望。 首先是观看人数…

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标

利用Python和pandas库进行股票技术分析&#xff1a;移动平均线和MACD指标 介绍准备工作数据准备计算移动平均线计算MACD指标结果展示完整代码演示 介绍 在股票市场中&#xff0c;技术分析是一种常用的方法&#xff0c;它通过对股票价格和交易量等历史数据的分析&#xff0c;来…