Vue3中Setup概述和使用(三)

news2024/11/25 18:37:37

一、引入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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天猫数据分析(天猫数据查询分析工具/软件):2023年天猫户外用品市场蓬勃发展,国产品牌具备竞争优势

后疫情时代&#xff0c;大众对于户外活动的热情高涨&#xff0c;参与度迅速提升&#xff0c;在这一消费热情下&#xff0c;我国的户外用品行业呈现出蓬勃的发展态势&#xff0c;市场规模不断扩大。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;2023年度&#xff0c;…

HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定

本文 我们还是来说 两个 harmonyos 状态管理的装饰器 Observed与ObjectLink 他们是用于 嵌套对象 或者 以对象类型为数组元素 的数据结构 做双向同步的 之前 我们说过的 state和link 都无法捕捉到 这两种数据内部结构的变化 这里 我们模拟一个类数据结构 class Person{name:…

Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化

简介 Python 的 pandas 包用于数据操作和分析&#xff0c;旨在让您以直观的方式处理带标签或关联数据。 pandas 包提供了电子表格功能&#xff0c;但由于您正在使用 Python&#xff0c;因此它比传统的图形电子表格程序要快得多且更高效。 在本教程中&#xff0c;我们将介绍如…

Python运算符大全,值得收藏

一、 Python的算术运算 Python的算术运算符与C语言类似&#xff0c;略有不同。包括加()、减(-)、乘(*)、除(/)、取余(%)、按位或(|)、按位与(&)、按位求补(~)、左移位(<<)、右移位(>>)、单目求反(-)、幂运算(**)、整除运算(//)、增强运算、增强矩阵乘法()。 …

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

数据结构第十五天(树的存储/孩子表示法)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 最近在知乎上看到的一个问题&#xff0c; 也许&#xff0c;短暂的离别&#xff0c;只为更好的相遇&#xff01; 2024&#xff0c;友友们&#xff0c;龙年快乐&#xff0c;新的一年&#xff0c;祝愿码上…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

蓝牙 - BTSnoop File Format

1, Overview [ 概览 ] BTSnoop 文件格式适用于存储 Bluetooth HCI 通讯数据。它与 RFC 1761 中记录的 snoop 格式非常相似。 The BTSnoop file format is suitable for storing Bluetooth HCI traffic. It closely resembles the snoop format, as documented in RFC 1761. 2, …

Linux(Ubuntu) 环境搭建:Nginx

注&#xff1a;服务器默认以root用户登录 NGINX 官方网站地址&#xff1a;https://nginx.org/en/NGINX 官方安装文档地址&#xff1a;https://nginx.org/en/docs/install.html服务器的终端中输入以下指令&#xff1a; # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

目录 排序的概念&#xff1a; 排序算法的实现&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 堆排序&#xff1a; 冒泡排序&#xff1a; 快速排序&#xff1a; 快速排序的基本框架&#xff1a; 1.Hoare法 2. 挖坑法 3.前后指针法 快…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

基于POSCMS架构开发的素材资源网平台整站全面修复版源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 资源简介 基于POSCMS架构开发的素材资源网平台整站全面修复版源码一键安装版 系统功能介绍 支持文章、论坛、下载、…

解决 postman测试接口报404 Not Found

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

2024给你一些Android 应用性能优化的建议

2024给你一些Android 应用性能优化的建议 在当今激烈竞争的移动应用市场中&#xff0c;用户对应用性能和体验的要求越来越高。因此&#xff0c;进行 Android 应用性能优化是开发过程中必不可少的一环。下面将详细介绍如何提升应用的性能&#xff0c;以提升用户体验。 1. 优化…

静态时序分析:建立时间分析

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;建立时间检查约束了触发器时钟引脚&#xff08;时钟路径&#xff09;和输入数据引脚&#xff08;数据路径&#xff09;之间的时序关系&#x…

EMC学习笔记(二十四)降低EMI的PCB设计指南(四)

降低EMI的PCB设计指南&#xff08;四&#xff09; 1.电路板分区2.信号走线2.1 电容和电感串扰2.2 天线2.3 端接和传输线2.4输入端的阻抗匹配 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.电路板分区 电路板分区与电路板平面规划具有相同的基本含义&#x…

ubuntu22.04 安装部署04:经常死机,鼠标,键盘无响应

相关文章&#xff1a; ubuntu22.04 安装部署01&#xff1a;禁用内核更新 ubuntu22.04安装部署02&#xff1a;禁用显卡更新 ubuntu22.04安装部署03&#xff1a; 设置root密码 一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.…

数据结构|对称矩阵压缩存储的下标公式推导|如何求对称矩阵压缩存储对应的一维数组下标

因为考试的时候可能会给很多情况的变式题&#xff0c;所以要会推导而不是背公式&#xff0c;情况变了&#xff0c;公式就不管用了。 行优先、只存储主对角线下三角区&#xff1a; 矩阵下标 ai,j(i>j)->一维数组下标 B[k] 按照行优先的原则&#xff0c;确定 ai,j 是一维数…

[word] word分割线在哪里设置 #其他#经验分享

word分割线在哪里设置 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word分割线在哪里设置的小技能&#xff0c;希望可以帮助到你。 1、快速输入分割线 输入三个【_】按下回车就是一条长直线&#xff0c;同样分别…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT(int类型)进行升序排列: 原来的数据库中存储: 排序# 结果是HOT字段为null的所有数据都排在最前面,不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是HOT字段为null的所有数据都排在最后面,不为null的数据按数…