vue3开启大海贼时代!!!

news2025/2/27 20:41:29

大海贼时代结束!!!

vue3开始!!!

setup初体验

1.与vue2不同的是 定义的变量和方法都被放到一个叫 setup( )里面了

2.vue2里面没有了 this 

3. 1)访问变量先定义

const msg = '1'

2)然后在return里面返回 变量名

3)在template 中进行渲染

4.案例demo

<template>
  <h2>{{ msg }}</h2>
  <button @click="btn">点一下</button>
</template>
<script>
export default {
  setup() {
    const msg = '1'
    const btn = () => {
      console.log("ss")
    }
    return {
      msg,
      btn
    }
  }
}
</script>

serup语法糖

1.在script 加setup(语法糖) 这样就可以不用先定义变量,在返回,在使用了

2.直接就可以下面定义,上面调用了

3.在引入模块和js文件时,记得一定要加上后缀名.vue

<template>
  <h1>{{ msg }}</h1>
  <button @click="appDate">点击出现js文件的内容</button>
  <hello></hello>
</template>
<script setup>
import { appDate } from './appDate.js'
// 一个模块
import hello from './components/hello.vue'
const msg = "标题"

</script>

ref 的使用

1.在setup里面定义的变量,对其不可以直接进行修改,需要先ref的处理

2.1)先引入  import { ref } from 'vue'

2)ref使用就是将值包起来,会生成一个 refimpl对象

    let num = ref(0)
    let str = ref("原字符串")

 3)操作数据需要加上   变量名.value才可以访问到对象里面的值  

4)如果变量是一个对象也同理,需要变量名.value.具体的名字

3.总结demo

<template>
  <h1>薪资{{ num }}</h1>
  <button @click="add">点击加薪</button>
  <h1>姓名:{{ object.name }}</h1>
  <h1>年龄:{{ object.age }}</h1>
  <button @click="objectData">点击修改个人信息</button>
</template>
<script>
// 引入ref
import { ref } from 'vue';
export default {
  setup() {
    // ref的基础用法 
    // 1.先引入 import
    // 2.ref(0) 将值修改成refimpl对象
    // 3.访问对象里面的value
    // 定义一个薪资值
    let num = ref(10)
    let add = () => {
      num.value += 1000
    }
    // 对象形式的定义一个对象
    let object = ref({
      name: "张三",
      age: 32
    })
    // 对对象进行修改   一定要  .value来获取对象里面的值
    let objectData = () => {
      object.value.name = "王五",
        object.value.age = "30"
    }
    return {
      // 返回用到的变量名和方法名
      num,
      add,
      object,
      objectData
    }
  }
}
</script>

reactive 修饰复杂的类型

1.不可以定义基本类型只可以定义引用类型

2.可以将一个数组直接放到 reactive

    let object = reactive({
      name: "张三",
      age: 32
    })

3.return 返回只需要返回数组的名字

    return {
      // 返回用到的变量名和方法名
      object,
      objectData
    }

4.在上面定义的引用插值表达时需要指定要变量名

<template>
  <h1>姓名:{{ object.name }}</h1>
  <h1>年龄:{{ object.age }}</h1>
  <button @click="objectData">点击修改个人信息</button>
</template>

5总体的demo

<template>
  <h1>姓名:{{ object.name }}</h1>
  <h1>年龄:{{ object.age }}</h1>
  <button @click="objectData">点击修改个人信息</button>
</template>
<script>
// 引入ref
import { reactive, ref } from 'vue';
export default {
  setup() {
    // reactive 修饰复杂的类型
    // 不可以定义基本类型只可以定义引用类型

    let object = reactive({
      name: "张三",
      age: 32
    })
    // reactive 不需要加value
    let objectData = () => {
      object.name = "王五",
        object.age = "30"
    }
    return {
      // 返回用到的变量名和方法名
      object,
      objectData
    }
  }
}
</script>

toRef与toRefs 的不同

1.

重新航海!!!

Vue2选项式Api Vue3组合式Api

<template>
  <h4> {{ name }} </h4>
</template>
<script>
export default {
  setup() {
    // 注册变量
    let name = "张三"
    // 导出
    return {
      name
    }
  }
}
</script>

ref的使用

1.定义一个响应式的数据

<template>
  <h4> {{ name }} </h4>
  <button @click="updateName">修改name</button>
</template>
<script>
import { ref } from 'vue'
export default {
  setup() {
    // 注册变量
    let name = ref("张三")

    const updateName = () => {
      console.log(name);
      name.value = '张四'
    }
    // 导出
    return {
      name,
      updateName
    }
  }
}
</script>

 reactive的案例使用 定义对象类型的响应式数据 

<template>
  <div>
    姓名:{{ counts.name }} <br />
    年龄:{{ counts.age }}<br />
    爱好:{{ counts.hoopy }}<br />
    喜欢:{{ counts.like }}<br />
  </div>
  <button @click="updateworld">魔法</button>
</template>
<script>
import { reactive } from 'vue'
export default {
  setup() {
    let counts = reactive({
      name: "小明",
      age: 10,
      hoopy: ['乒乓球', '篮球', '足球'],
      like: {
        name: "篮球",
        time: "10年"
      }
    })
    const updateworld = () => {
      counts.name = '小用'
      counts.age = 23
      counts.hoopy[2] = "橄榄球"
      counts.like.name = "橄榄球",
        counts.like.time = "30年"
    }
    // 导出
    return {
      counts,
      updateworld
    }
  }
}
</script>

vue2的拦截方式的缺陷

Vue2的

对象中新增一个属性  和删除一个 属性  Object.defineProperty 拦截不到出现 (数据修改了,页面不变)        曲线救国

新增属性让Vue拦截到       this.person (对象名)

  1. 一个属性this.$set( this.person  ,  ' 属性名字 '  , ' 添加的元素 ')
  2. 引入 Vue实例  通过Vue.set( this.person ,  'sex'  ,  ' 女 '  )

删除属性让Vue拦截到   

  1. this.$delete(this.person , ' 删除的属性名 ')
  2. Vue.delete(this.person , ' 删除的属性名 ')

Vue3的 数据双向绑定

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let person = {
            name: "张三",
            age: 23
        }

        // Proxy 代理 拦截对象 
        // Reflect 反射 对数据进行操作
        const p = new Proxy(person, {
            /**
             * 第一个参数 Proxy 化的person对象
             * 第二个参数 propName 修改的那个属性
             * */
            get(target, propName) {
                console.log("get读取到了");
                return Reflect.get(target, propName)
            },
            // value  修改的值
            set(target, propName, value) {
                console.log("set修改了");
                Reflect.set(target.propName, value)
            },
            deleteProperty(target, propName) {
                console.log("数据删除了经过了");
                return Reflect.deleteProperty(target, propName)
            }
        })



    </script>
</body>

</html>

Vue3 和 Vue2 的区别 

  1. setup 比  beforeCreate () 执行的还早 , setup里面取不到 this 事 undefined
  2. Vue2中props 传值 可以不接收在 this.$attrs里面获取   Vue3 不接收会发出警告,必须用props接收 在setup第一个参数中获取到值 
  3. Vue3中的自定义事件子传父  Vue3中必须要用 emits 接收在setup 的第二个参数 context.emit(' ')中获取
  4. Vue3中 setup的第二个参数 里面 
    1. attrs:父组件传递过来的参数,不接收到这里面了 
    2. emit:父组件自定义的方法
    3. slots:父组件在组件插槽中插入的dom元素
  5. 组件的传值和自定义事件的使用和插槽
    // 组件传值接收  
    props: ['personName', 'personAge'],
    // 自定义方法接收    
    emits: ['hello'],
    // 插槽 
        <template v-slot:school>
          <h1>尚硅谷school</h1>
        </template>
    // 插槽使用 
     <slot name="school"></slot>
  6. 计算属性
    <template>
      <h1>计算属性</h1>
      <input type="text" v-model="person.firstName"> <br>
      <input type="text" v-model="person.lastName"> <br>
      <input type="text" v-model="person.sumName">
    </template>
    <script>
    import { computed, reactive } from 'vue'
    export default {
      setup() {
        let person = reactive({
          firstName: "张",
          lastName: "三"
        })
        // 计算属性的渐变方法  不能修改
        // person.sumName = computed(() => {
        //   return person.firstName + "-" + person.lastName
        // })
    
        // 计算属性  可以修改
        person.sumName = computed({
          get() {
            return person.firstName + '-' + person.lastName
          },
          set(value) {  //修改的值
            let sumValue = value.split('-') // 转化成字符串
            // console.log(sumValue);
            person.firstName = sumValue[0]
            person.lastName = sumValue[1]
          }
        })
        return {
          person
        }
      }
    }
    </script>
  7. 监视属性
    1. Vue2的监视属性
        watch: {
          // 简易版的:
          // numberOne(newValue, oldValue) {
          //   console.log("数据", newValue, oldValue);
          // }
          numberOne: {
            handler(newValue, oldValue) {
              console.log("监听到了", newValue, oldValue);
            },
            deep: true,
            immediate: true
          }
        },
    2. Vue3的监听 Vue3的监听是一个函数的形式
          // 监听单个 第一种
          watch(numberOne, (newValue, oldValue) => {
            console.log("监听的值:", newValue, oldValue);
          })
      
          // 监听多个 第二种
          watch([StringTwo, numberOne], (newValue, oldValue) => {
            console.log("监听的值:", newValue, oldValue);
          })
      
      
          // 监听reatvie 属性的对象 
          /**
           *  oldValue失效
           *  deep: false 失效
           * */
          // watch(person, (newValue, oldValue) => {
          //   console.log("监听的值", newValue, oldValue);
          // }, {
          //   deep: false
          // })
      
          // 监听reactive 的一个属性  第一个参数设置函数  第三种
          // watch(() => person.name, (newValue, oldValue) => {
          //   console.log("监听的值:", newValue, oldValue);
          // })
      
          // 监听reactive 的多个属性                第四种
          // watch([() => person.name, () => person.age], (newValue, oldValue) => {
          //   console.log("监听的值:", newValue, oldValue);
          // })
    3. watchEffect 函数 
      1. 非惰性的,首页刷新执行!
      2. 全都监视 用谁监视谁  使用场景 只要发生修改watchEffect  的代码就执行。
  8. 生命周期函数讲
    1. 销毁前(beforeDestroy )和( destroyed ) 销毁 修改成了 卸载前( beforeUnmount ),已卸载( unmounted )
  9.  reactive, ref, shallowReactive, shallowRef

    1.     /**
           * const person = reactive({ // 深层响应式
           * const person = shallowReactive({ // 浅层响应式
           * const person = ref({ // 可以对对象响应式 
           * const person = shallowRef({ // 限制ref能对对象的响应式
           * 
          */
  10. , toRef, toRefs

    1.     return {
            obj,
            ...toRefs(person)  // 导出整个对象
            // name: toRef(person, 'name'), // 导出单个
            // Hname: toRef(person.hoopy, "Hname") // 导出单个
          }

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

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

相关文章

[架构之路-196] - 发现问题原因的通常步骤:提出问题、明确问题、偏差分析、因素分析、原因分析

目录 前言&#xff1a; 通用问题的方法论 第一步&#xff1a;是提出问题阶段&#xff1a;表象、总体、大致 第二步&#xff1a;是明确问题阶段&#xff08;深层&#xff09;&#xff1a;分解、分类、排序 第三步&#xff1a;是明确问题阶段&#xff08;目标&#xff09;&a…

关于一个C++项目:高并发内存池的开发过程(一)

原项目地址&#xff1a;高并发内存池项目: 高并发内存池项目的课堂板书代码 (gitee.com) 写在前面 本打算利用五一假期的时间将这个项目一口气开发完成&#xff0c;但由于本人的懈怠&#xff0c;这个项目最终只完成了80%。于是利用长假后的一天假期&#xff0c;将这个项目的框…

springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理

介绍 本系统为springboot整合security&#xff0c;mybatisPlus&#xff0c;thymeleaf实现登录认证及用户&#xff0c;菜单&#xff0c;角色权限管理。页面为极简模式&#xff0c;没有任何渲染。 源码&#xff1a;https://gitee.com/qfp17393120407/spring-boot_thymeleaf 开发…

算法训练Day59:503.下一个更大元素II 42. 接雨水

文章目录 [下一个更大元素 II](https://leetcode.cn/problems/next-greater-element-ii/description/)题解 接雨水题解 下一个更大元素 II CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (66.68%)8060--0 Tags 堆 | 数组 | 单调栈 Compani…

企业信息化战略与实战(三)-企业信息化与电子商务概念

上面我们了解了政府信息化与企业信息化的部分概念,今天继续了解企业信息化的相关概念和电子商务相关概念。 1、决策支持系统(DSS) 了解基本理念和组成部分即可. 决策支持系统的作用一般是供决策,做辅助用途的系统,当你做一个决策的时候,你可以需要给你的决策做支持。比如…

05- redis集群模式搭建(上) (包含云服务器[填坑])

目录 1. 准备环境: 2. 简介: -> 2.1 前言: -> 2.2 Redis集群架构实现了对redis的水平扩容 -> 2.3 redis cluster集群原理 3. 搭建后特别需要注意的问题 ->3.1 [重点]: 如果一个服务出现故障: 是否可以继续提供服务??? ---> 3.1.1 如果集群中故障re…

PCIe的capability扩展空间字段解释

解释 这是一段关于高级错误报告的信息&#xff0c;其中包含多个字段和值。以下是每个字段的详细解释&#xff1a; Capabilities: [100 v1] Advanced Error Reporting 这是该设备支持高级错误报告的能力标识符。 UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- R…

python的文件操作模块shutil和pathlib总结

一&#xff1a;shutil模块 1&#xff0c;shutil模块安装 pip insatll shutilwhich 2&#xff0c;shutil支持的方法 可以通过dir(shutil)查看shutil支持的方法和属性 [Error, ExecError, ReadError, RegistryError, SameFileError, SpecialFileError, _ARCHIVE_FORMATS, _BZ2_…

当列车穿过时空隧道:解密力扣“计算列车到站时间”

本篇博客会讲解力扣“2651. 计算列车到站时间”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是输出示例&#xff1a; 以下是提示&#xff1a; 这道题是给大家树立信心的。计算方法&#xff1a;(预期时间延误时间)%24即可。 int findDelayedArrivalTim…

奇技淫巧第8期

学无止境。 下面是对去年11月至今年5月的零散知识点总结。 春节期间好好放松了一两个月&#xff0c;来校后又懒散的度过了一两个月&#xff0c;直到论文评审意见下来&#xff0c;才开启冲刺模式狂干了一两个月。总的来说&#xff0c;这半年来摸的时间比较多。好&#xff0c;不废…

想学好Python的话,这6本书带你从入门到精通

推荐几本在豆瓣评分很不错的Python学习书籍&#xff0c;这些书的电子版被我搜集整理了出来&#xff0c;今天分享给大家。 书籍包括《Python编程&#xff1a;从入门到实践》、《Python编程快速上手》、《流畅的Python》、《像计算机科学家一样思考Python》、《利用Python进行数…

树状数组C++详解

树状数组介绍 在学习一个算法之前一定要清楚它能干嘛&#xff0c;能解决什么样的问题&#xff0c;对你解题是否有帮助&#xff0c;然后才去学习它! 那么接下来看如下几个问题 什么是树状数组 顾名思义就是一个结构为树形结构的数组&#xff0c;于二叉树的结构类似但又不同&…

基于SpringBoot+Vue的养老院系统

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

【C++初阶】第十一篇:stack和queue的使用与模拟实现

文章目录 stack和queue的介绍和使用stack的介绍stack的定义方式stack的使用 queue的介绍queue的定义方式queue的使用 stack和queue的模拟实现容器适配器stack的模拟实现queue的模拟实现 总结&#xff1a; stack和queue的介绍和使用 stack的介绍 stack的文档介绍 stack是一种容…

文本三剑客之~~~sed命令

目录 sed概念sed 的工作流程&#xff1a;命令格式&#xff1a;常用选项&#xff1a;常用操作&#xff1a; 示例&#xff1a;打印删除替换&#xff1a;插入&#xff1a;剪切复制将字符替换位置 sed概念 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提…

Allegro加密PCB文件

写在前面&#xff1a; 记得以前不知道Allegro可以加密PCB文件的时候&#xff0c;就遇到了尴尬的事情。 其一&#xff1a;要发给别人layout文件&#xff0c;但是又怕别人外传&#xff0c;而且有关于公司文件保密的问题&#xff0c;其实这不论是公事还是私事&#xff0c;如果我…

软测人正在杀死软测行业

前言、一个软件做出来&#xff0c;最不能少的人是谁&#xff1f; 不用说就是开发&#xff0c;因为开发是最了解软件运作的那个人&#xff0c;早期不少一人撸网站或者APP的例子&#xff0c;相当于一个人同时是产品、研发、测试、运维等等&#xff0c;这也是为何开发是地位和上限…

如何一步一步构建网站ChatGPT插件

在本文中&#xff0c;我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件&#xff0c;旨在帮助网站生成一个ChatGPT提示测试题&#xff0c;以巩固当前网页的内容。 1、抽象提取 这个网站ChatGPT插件大概的效果&#xff0c;类比的…

股票量价关系基础知识7----图解各阶段量价关系:价涨量缩

图解各阶段量价关系&#xff1a;价涨量缩 价涨量缩是指股价上涨&#xff0c;成交量却萎缩的一种价量背离走势。它通常反映上涨力道不足&#xff0c;预示股价可能反转向下。 一、上涨初期的价涨量缩 &#xff08;一&#xff09;形态分析 股价经过一轮下跌后止跌回升&#xff0c…

Redis中的缓存穿透、雪崩、击穿

概述&#xff1a; 缓存穿透&#xff1a;大量请求根本不存在的key&#xff0c; 应用服务器压力变大缓存雪崩&#xff1a;redis中大量key集体过期&#xff0c;数据库压力变大&#xff0c;服务器崩溃缓存击穿&#xff1a;redis中一个热点key过期&#xff08;大量用户访问该热点ke…