【Vue3】初始化和Composition API(组合式)

news2025/1/17 21:49:39

Vue3

      • 创建Vue3.0工程
          • 查看自己的vue/cli版本,使用Vue/cli创建
          • 使用vite创建
      • 查看Vue3.0工程
          • vue.config.js中,关闭语法检查,
          • main.js讲解
          • app.vue讲解
      • 常用的Composition API(组合式)
          • 1.拉开序幕的setup
            • 返回对象
            • 返回渲染函数
            • 注意事项,
          • 2,ref函数
            • 1,他的实例是RefImpl
            • 2,向里一层,看value
            • 3,所以,修改变量得用.value
            • 4,修改对象的时候
          • 3,reactive函数
            • 修改数组
            • 优化后的reactive
          • 4,reactive对比ref

创建Vue3.0工程

查看自己的vue/cli版本,使用Vue/cli创建
  • cmd,vue -V,要在4.5.0版本以上
  • vue create 项目名
  • 创建Vue3项目
使用vite创建
  • 新一代前端构建工具
  • 开发环境下,无需打包,可快速冷启动
  • 轻量快速的热重载(HMR)
  • 真正的按需编译

开始创建

  • npm init vite-app 项目名
  • cd 项目名
  • npm i
  • npm run dev

查看Vue3.0工程

vue.config.js中,关闭语法检查,
  • 防止编译器报错,调试麻烦,记得重启
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave:false//关闭语法检查
})
main.js讲解
  • vue2中
// vue2中,借助render,传入h,h就是外壳app
new Vue({
    render: (h) => h(App)
}).$mount('#app')
  • vue3中,通过引用createApp,无需通过new,可以直接调用
import { createApp } from 'vue'
import App from './App.vue'
  • 创建应用实例对象
const app = createApp(App)
  • 挂载
app.mount("#app")
  • 卸载
app.unmount("#app")
app.vue讲解

VUE3组件中的模板结构可以没有根标签
VUE2中没有会报错

常用的Composition API(组合式)

1.拉开序幕的setup
  • vue3,中的新的配置项。值是一个函数
  • 在vue3中,组件中所用到的数据,方法等,均要配置在setup中
  • 在vue2中,配置数据在data,配置方法在methods,
  • setup两种返回值
  • 1,若返回一个对象,则对象中的属性,方法在模板中均可直接使用
  • 2,若返回一个渲染函数,则自定义渲染内容
返回对象

在这里插入图片描述

<template>
  <!-- VUE3组件中的模板结构可以没有根标签 -->
  <h1>我是{{name}},{{age}}</h1>
  <button @click="sayword">点我</button>
</template>

<script>
export default {
  name: 'App',
  setup(){
    let name ="乞力马扎罗"
    let age =18
    function sayword(){
      console.log(`你好${name},我${age}`)
    }
    return{
      name,
      age,
      sayword
    }
  },
}
</script>

<style>

</style>
返回渲染函数

在这里插入图片描述

<template>
  <!-- VUE3组件中的模板结构可以没有根标签 -->
  <h1>我是{{name}},{{age}}</h1>
  <button @click="sayword">点我</button>
</template>
<script>
import {h} from "vue"
export default {
  name: 'App',
  setup(){
    let name ="乞力马扎罗"
    let age =18
    function sayword(){
      console.log(`你好${name},我${age}`)
    }
    return ()=>h('button','看我强制替换你')
  },
}
</script>

<style>

</style>
注意事项,
  • vue2和vue3可以混合用,但不介意,vue2中调用setup中数据可以,但vue3的setup调用vue2会报错
  • 如果重名,setup优先
  • setup不能是async函数
2,ref函数
  • ref不是属性,得import引入
  • 在模板里面使用不用.value,当发现是ref对象的时候,自动.value了
  • 创建了一个包含响应式的引用对象(简称ref对象)
  • 修改变量的时候,是通过.value
  • 修改对象的时候, vue3中,把Proxy封装到了ractive函数
import {ref} from "vue"
  • 先打印一下经过ref后的值,长什么样子!
 setup() {
    let name =ref("乞力马扎罗"); 
    let age = ref(18);
    function sayword() {
      console.log(name,age);
    }
    return {
      name,
      age,
      sayword,
    };
  },

在这里插入图片描述

1,他的实例是RefImpl
  • 代表reference(引用) implement(实现)
  • 也叫引用实现的实例,叫引用对象
2,向里一层,看value
  • set和get被放在原型里面
    在这里插入图片描述
3,所以,修改变量得用.value

在这里插入图片描述

 setup() {
    let name =ref("乞力马扎罗"); 
    let age = ref(18);
    function sayword() {
      name.value="罗曼蒂克"
      age.value=42
      console.log(name,age);
    }
    return {
      name,
      age,
      sayword,
    };
  },
4,修改对象的时候

在这里插入图片描述

  • object本身是reflmpl,把传入的对象变成了Proxy的代理对象
  • 修改的时候,一个value即可更新里面所有的,不用两个value
<template>
  <h1>我是{{ name }},{{ age }}</h1>
  <h1>我是{{ job.type }},{{ job.salus}}</h1>

  <button @click="sayword">点我更新信息</button>
</template>

<script>
import {ref} from "vue"
export default {
  name: "App",
  setup() {
    let name =ref("乞力马扎罗"); 
    let age = ref(18);
    let job = ref({
      type:"前端",
      salus:"30k"
    });
    function sayword() {
      name.value="罗曼蒂克"
      age.value=42
      job.value.type="后端"
      console.log(name,age);
    }
    return {
      name,
      age,
      job,
      sayword,
    };
  },
};
</script>

<style>
</style>

3,reactive函数
  • 通过这个对象就不用.value更新了
  • 作用,定义一个对象类型的响应式数据,(基本类似采用ref)
  • 语法,const 代理对象 = reactive(源对象),接收一个对象或者数组,返回一个代理对象(Proxy对象)
  • reactive定义的响应式数据是“深层次”的
  • 内部其实是基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作
<script>
import {reactive, ref} from "vue"
export default {
  name: "App",
  setup() {
    let name =ref("乞力马扎罗"); 
    let age = ref(18);
    let job = reactive({
      type:"前端",
      salus:"30k"
    });
    function sayword() {
      name.value="罗曼蒂克"
      age.value=42
      job.type="后端"
    }
    return {
      name,
      age,
      job,
      sayword,
    };
  },
};
</script>
修改数组
<template>
  <!-- VUE3组件中的模板结构可以没有根标签 -->
  <h1>我是{{ name }},{{ age }}</h1>
  <h1>我是{{ job.type }},{{ job.salus}}</h1>
  <h1>我是{{ list[0] }}</h1>
  <button @click="sayword">点我更新信息</button>
</template>

<script>
import {reactive, ref} from "vue"
export default {
  name: "App",
  setup() {
    let name =ref("乞力马扎罗"); 
    let age = ref(18);
    let job = reactive({
      type:"前端",
      salus:"30k"
    });
    let list = reactive([1,2,3]);
    function sayword() {
      name.value="罗曼蒂克"
      age.value=42
      list[0]=4
      job.type="后端"
    }
    return {
      name,
      age,
      job,
      list,
      sayword,
    };
  },
};
</script>

<style>
</style>
优化后的reactive
<template>
  <h1>我是{{ person.name }},{{ person.age }}</h1>
  <h1>我是{{ person.job.type }},{{ person.job.salus }}</h1>
  <h1>我是{{ person.list[0] }}</h1>
  <button @click="sayword">点我更新信息</button>
</template>

<script>
import { reactive, ref } from "vue";
export default {
  name: "App",
  setup() {
    let person = reactive({
      name: "乞力马扎罗",
      age: 18,
      job: {
        type: "前端",
        salus: "30k",
      },
      list: [9],
    });
    function sayword() {
      console.log(person)
      person.name='罗曼蒂克'
      person.list[0]='罗曼蒂克'
    }
    return {
      person,
      sayword,
    };
  },
};
</script>

<style>

</style>
4,reactive对比ref

从定义的角度

  • ref用来定义 基本数据类型
  • reactive用来定义,对象(或数组)类型数据
  • 当然,ref也可以定义对象或者数据类型,但他内部会自动通过reactive转为代理对象

从原理角度:

  • ref通过Object。defineProperty()的get和set来实现响应式(数据劫持)
  • reactive通过使用es6里的Proxy来实现响应式(数据劫持),并通过reflect操作源对象内部的数据

从使用的角度

  • ref定义的数据,操作数据需要.value,读取数据时模板中直接读取,不需要.value
  • reactive定义的数据,操作数据与读取数据,均不需要.value

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

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

相关文章

降级npm后,出现xxx 不是内部或外部命令解决方法

比如我安装了anyproxy npm install anyproxy -g 之后在cmd中输入anyproxy 发现 anyproxy 不是内部或外部命令解决方法. 一般出现这样的问题原因是npm安装出现了问题&#xff0c;全局模块目录没有被添加到系统环境变量。 Windows用户检查下npm的目录是否加入了系统变量P…

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测 目录 时序预测 | MATLAB实现Hamilton滤波AR时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 预测在很大程度上取决于适合周期的模型和所采用的预测方法,就像它们依赖于过滤器提取的周期一样。标准 Hodrick-P…

Top-down方法学

Top-down方法学由Intel提出&#xff0c;是一种软件性能分析技术。 x86处理器的PMU一般提供8个PMC&#xff0c;其中4个是固定的PMC&#xff0c;其对应的监控信号是不能配置的。另外4个PMC监控的信号是可以配置的。 Top-down方法学的动机 通过PMC&#xff0c;软件工程师可以获…

【观察】超融合+软件定义,构建双活数据中心“新范式”

随着数字化转型的加速&#xff0c;企业的业务经营活动越来越多依赖于数据中心等基础设施&#xff0c;“全天候”业务连续性运营也正成为大中型企业追求的目标&#xff0c;如何实现减少甚至消除正常和非正常的停机对业务可用性造成的影响&#xff0c;不但是企业IT建设与运维团队…

Spring - 更简单的获取 Bean 对象

目录 二、获取 Bean 对象&#xff08;对象装配或者对象注入&#xff09; 1. 属性注入 1.1 属性注入的优点和缺点&#xff1a; 2. Setter注入 2.1 Setter注入的优点和缺点 3. 构造方法注入&#xff08;spring 官方推荐的对象注入方式&#xff09; 3.1 构造方法的优点和缺点…

【PHP面试题47】Redis的持久化有哪几种?有什么区别?谈谈你的理解

文章目录 一、前言二、RDB&#xff08;Redis数据库&#xff09;持久化方式2.1 触发条件2.2 RDB文件的格式2.3 RDB持久化原理2.4 RDB方式的优缺点 三、AOF&#xff08;Append Only File&#xff09;持久化方式3.1 触发条件3.2 AOF文件的格式3.3 AOF持久化原理3.4 AOF方式的优缺点…

cmake项目相关的变量

cmake项目相关的变量 在cmake项目中&#xff0c;通常需要对路径进行操作&#xff0c;比如我们需要知道源码的顶级目录&#xff0c;源码的构建目录和某个project名字相关的一些目录等。 CMAKE_SOURCE_DIR&#xff0c;这个变量的值代表的是源码的顶级目录。但是这个变量的值可能…

Python(十一)变量多次赋值

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【hadoop】部署hadoop的本地模式

hadoop的本地模式 本地模式的特点部署本地模式测试本地模式是否部署完成 本地模式的特点 没有HDFS、也没有Yarn只能测试MapReduce程序&#xff0c;作为一个普通的Java程序处理的数据是本地Linux的文件一般用于开发和测试 部署本地模式 进入该路径 /root/training/hadoop-2.7…

吴恩达机器学习2022-Jupyter

1 可选实验室: Python、 NumPy 和矢量化 简要介绍本课程中使用的一些科学计算。特别是 NumPy 科学计算包及其与 python 的使用。 2 目标 在这个实验室里将回顾课程中使用的 NumPy 和 Python 的特性。 Python 是本课程中使用的编程语言。NumPy 库扩展了 python 的基本功能&a…

mac 如何批量修改图片名称

mac 如何批量修改图片名称&#xff1f;很多使用mac电脑的小伙伴一直有这样一个疑问&#xff0c;怎么在电脑上一次性的批量修改大量图片的名称&#xff0c;很多小伙伴在电脑上整理图片的时候都需要批量重命名&#xff0c;批量处理的功能可以让我们节省不少的时间和精力&#xff…

抖音seo怎么选择关键词

要查找抖音的关键词&#xff0c;以进行SEO优化&#xff0c;可以按照以下步骤进行&#xff1a; 1. 关键词分析与筛选&#xff1a; 首先&#xff0c;你需要确定你的目标受众和内容类型。了解你的目标用户是谁&#xff0c;他们可能会搜索什么样的内容。然后&#xff0c;使用关键…

虾皮一面:手写一个Strategy模式(策略模式)

说在前面 在40岁老架构师 尼恩的读者交流区(50)中&#xff0c;最近有指导一个小伙伴面试架构师&#xff0c;面试的公司包括虾皮、希音、美团等大厂&#xff0c;目标薪酬50K以上&#xff0c;遇到了一个比较初级的问题&#xff1a; 请手写一个Strategy模式&#xff08;策略模式…

基于物联网技术的养老院管理系统设计与实现_kai

基于物联网技术的养老院管理系统设计与 实现 摘 要 随着我国老年人口数量的逐年增加&#xff0c;人口抚养比也在迅速攀升&#xff0c;越来越多的老年人将走 出家门进入养老院安度自己的晚年。同时国家和地方也相继出台了加快发展老龄事业的政策 方针&#xff0c;作为机构养老…

Shell之循环语句 —— For 实验

循环 循环就是重复执行一段代码的结构&#xff0c;通过循环可在满足一定的条件下&#xff0c;多次执行相同的代码。 循环语句&#xff1a;循环体 —— 代码的总结构 循环条件 —— 当循环条件满足时&#xff0c;循环体代码才会被执行&#xff0c;否则条件不满足…

SpringCloud Alibaba——Nacos中的Distro协议

一、Nacos中的Distro协议 Nacos 每个节点自己负责部分的写请求。每个节点会把自己负责的新增数据同步给其他节点。每个节点定时发送自己负责数据的校验值到其他节点来保持数据一致性每个节点独立处理读请求&#xff0c;及时从本地发出响应。新加入的 Distro 节点会进行全量数据…

【高并发网络通信架构】3.引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

目录 一&#xff0c;往期文章 二&#xff0c;基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select&#xff0c;poll&#xff0c;epoll 三者对比 三&#xff0c;函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_cre…

前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

读数据压缩入门笔记07_自适应统计编码

1. 位置对熵的重要性 1.1. 为了计算概率总需要多遍历一次数据集&#xff0c;而在计算出整个数据集中各符号的出现概率后&#xff0c;还要继续处理这些数值 1.1.1. 如果是相对较小的数据集&#xff0c;那么这些就不是什么问题 1.2. 随着要压缩的数据集变大&#xff0c;统计编…

Python异常值检测——案例分析

目录 1.单个变量异常值检测 2. 双变量关系中的异常值检测 3. 使用线性回归来确定具有重大影响的数据点 4. 使用k最近邻算法找到离群值 5. 使用隔离森林算法查找异常 1.单个变量异常值检测 如果某个值离平均值有多个标准偏差&#xff0c;并且远离近似标准正态分布的值&#…