Vue3(一) Vite创建Vue3工程,选项式API与组合式API;setup的使用;Vue中的响应式ref,reactive

news2024/9/20 23:06:31

文章目录

  • 一、创建Vue3工程
    • 1. vue-cli方式
    • 2. vite方式
    • 3. 项目小说明
    • 4. 安装插件:
      • (1) Prettier--整理格式
      • (2) Vue-official
  • 二、 OptionsAPI 与 CompositionAPI
    • 1 选项式API的弊端
    • 2 组合式API的优势
  • 三、setup
    • 1. 基本使用
    • 2 setup与组合式API
    • 3 setup语法糖
  • 四、Vue中的响应式
    • 1. ref创建基本类型的响应式数据
    • 2. reactive创建对象类型的响应式数据
    • 3. ref创建对象类型的响应式数据
    • 4. toRef和toRefs
    • 5. ref与reactive对比

一、创建Vue3工程

1. vue-cli方式

备注:目前vue-cli已处于维护模式,官方推荐基于 Vite 创建项目。

## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version

## 安装或者升级你的@vue/cli 
npm install -g @vue/cli

## 执行创建命令
vue create vue_test

##  随后选择3.x
##  Choose a version of Vue.js that you want to start the project with (Use arrow keys)
##  > 3.x
##    2.x

## 启动
cd vue_test
npm run serve

2. vite方式

vite官网中文:Vite;Vite 是新一代前端构建工具,优势如下:

  • 轻量快速的热重载(HMR),能实现极速的服务启动。
  • TypeScriptJSXCSS 等支持开箱即用。
  • 真正的按需编译,不再等待整个应用编译完成。
    在这里插入图片描述
    Vue3向下兼容Vue2语法,且Vue3中的模板中可以没有根标签

3. 项目小说明

项目的入口文件是index.html
在这里插入图片描述
加载index.html后,Vite 解析 <script type="module" src="/src/main.ts"> 指向的文件。
在这里插入图片描述

4. 安装插件:

(1) Prettier–整理格式

在这里插入图片描述
setting.json文件里,改成红色那一行(我是改这一行就好了)
在这里插入图片描述

(2) Vue-official

在这里插入图片描述
官方推荐安装,先安装吧,后续写代码会有帮助。到时候会记录

二、 OptionsAPI 与 CompositionAPI

  • vue2中的API设计是Options风格的(选项式或配置式)
  • vue3中的API设计是Composition风格的(组合式)

1 选项式API的弊端

选项式的API:数据、方法、计算属性等,是分散在:datamethodscomputed中的,若想新增或者修改一个需求,就需要分别修改:datamethodscomputed,不便于维护和复用。(学习vue2其实主要就是在学一个一个的配置项data,methods)
在这里插入图片描述

2 组合式API的优势

可以用函数的方式,更加优雅的组织代码,让相关功能的代码更加有序的组织在一起。
在这里插入图片描述

说明:以上两张动图原创作者:大帅老猿

三、setup

1. 基本使用

现有这样一个页面:
在这里插入图片描述
在vue2中,使用的是配置项的方式:

 // 数据
 data() {
   return {
     nickName: "tom",
   };
 },
// 方法
 methods: {
   changeName() {
     this.nickName = "Tom";
   },
 }

vue3中使用setup函数

setup() {
  // 数据,对应到vue2中是应该写在data配置项中;
  // 此时的hobby,age都不是响应式的数据
  let hobby = "sing";
  let age = 18;

  // 方法,对应到vue2中是应该写在methods配置项中,
  function changeHobby() {
    hobby = "dance"; // 注意:这样修改name页面没有变化
    console.log(hobby); // hobby的值确实改了,但不是响应式的
  }
  function changeAge() {
    age = age + 1;
  }
  // console.log(this); // undefined,vue3中已经弱化了this
  return { h: hobby, age, changeHobby, changeAge };
},

setup特点:

  • setup函数里的this值是undefined
  • setup函数中的数据不是响应式的。数据值改了,但是页面不会更新
  • setup执行的时机比vue2中的beforeCreate钩子函数还要早
  • 页面结构中若要用到setup里的数据,需要setup函数return返回。
    • 若返回一个对象:则对象中的:属性、方法等,在模板中均可以直接使用。
      在这里插入图片描述
    • 若返回一个函数:则可以自定义渲染内容
      setup(){
       return ()=>'哈哈' 	// 页面上直接渲染 '哈哈'两个字
      }
      

2 setup与组合式API

  • Vue2的配置(datamethos…)中可以访问到 setup中的属性、方法。
  • 但在setup不能访问到Vue2的配置(datamethos…)。
  • 如果与Vue2冲突,则setup优先。
    在这里插入图片描述

3 setup语法糖

script标签里标注setup后,就不用再写setup函数,return;

<!-- 数据、方法 -->
<script setup lang='ts'>
	let age = 18;
	let h = "sing";
	function changeHobby() {
	  h = "dance";
	}
	function changeAge() {
	  age = age + 1;
	}
</script>

此时无法指定组件名称,组件名称(Person)默认为文件名Person.vue;语法糖模式下指定组件名有两种方式:

方式一 :需要再编写一个不写setupscript标签,去指定组件名字

<!-- 这个主要用来定义组件名称 -->
<script  lang='ts'>
export default {
  name: "Person",
};
</script>
<!-- 数据、方法 -->
<script setup lang='ts'>
...
</script>

方式二 :安装插件
(1)安装:npm i vite-plugin-vue-setup-extend -D
(2)配置: vite.config.ts
在这里插入图片描述
(3) 使用:<script setup lang='ts' name="Person">

拓展:使用第二种方式,App引入Person组件时报错
在这里插入图片描述
这是插件的问题,卸载vetur插件即可,vue2.x使用vetur插件,vue3.x更换成Vue-Official插件可更好的支持TS

四、Vue中的响应式

1. ref创建基本类型的响应式数据

  • 语法:let xxx = ref(初始值)
  • 返回值:一个RefImpl的实例对象,简称ref对象refref对象的value属性是响应式的。
  • 注意点:
    • JS中操作数据需要:xxx.value,但模板中不需要.value,直接使用即可。
    • 对于let age = ref(18);来说,age不是响应式的,age.value是响应式的。
 <div>
   <h1>爱好:{{ hobby }}</h1>
   <!--无需.value-->
   <h1>年龄:{{ age }}</h1>
   <button @click="changeAge">点击改变年龄</button>
 </div>
<script setup lang='ts' name="Person">
// 1. 引入ref
	import {ref} from 'vue'
// 2. 谁需要变成响应式数据,ref就包裹谁	
	let age = ref(18);
	let hobby = "sing";
	function changeAge() {
	  age.value = age.value + 1;
	};
	console.log(age);
	console.log(hobby);
</script>

在这里插入图片描述
可以看出hobby还是那个hobby,而age已经变成一个RefImpl的实例对象了。

2. reactive创建对象类型的响应式数据

  • 作用:定义一个响应式对象(基本类型不要用它,要用ref,否则报错)
  • 语法:let 响应式对象= reactive(源对象)
  • 返回值:一个Proxy的实例对象(响应式对象)。
<template>
	<div>
		<h1>一辆{{ car.brand }}车,价值{{ car.price }}w元</h1>
		<button @click="changePrice">修改汽车价格</button>
	</div>
</template>

<script setup lang='ts' name="Person">
// 1. 引入reactive
import {reactive} from 'vue'
// 2. 使用
let car = reactive({brand:'奔驰',price:20})
let games = reactive([{id:1,name:'超级玛丽'},{id:2,name:'狼人杀'}])
function changePrice() {
  car.price ++;
};
console.log(car);
console.log(games);
</script>

操作对象的响应式数据时,不用.vlaue了
在这里插入图片描述

  • 注意点:reactive定义的响应式数据是深层次的。

    <template>
    	 <div>
    		<h1>{{ obj.a.b.c }}</h1>
    		<button @click="changeC">修改C</button>
    	 </div>
    </template>
    
    <script setup lang='ts' name="Person">
    import {reactive} from 'vue'
    let obj = reactive({
      a: {
        b:{
          c:10
        }
      }
    })
    function changeC(){
      obj.a.b.c = 80
    
    }
    </script>
    

3. ref创建对象类型的响应式数据

  • ref接收的数据可以是:基本类型、对象类型。
  • ref接收的是对象类型,内部其实也是调用了reactive函数。
import {reactive,ref} from 'vue'
let car = ref({brand:'奔驰',price:20})
let obj = reactive({a:100})
console.log(car);
console.log(obj);

在这里插入图片描述

4. toRef和toRefs

将响应式对象解构之后获得的变量,就不是响应式的了

let person = reactive({
  name: "tom",
  age: 18,
})
// name,age不再是响应式数据,其值变化时,页面不更新
let { name, age } = person
// 上述解构赋值等价于
let name = person.name
let age = person.age

toReftoRefs将一个响应式对象中的每一个属性,转换为ref对象。
toRefstoRef功能一致,但toRefs可以批量转换。

import { reactive, toRefs, toRef } from "vue"

let { name, age } = toRefs(person)
console.log(toRefs(person))
console.log("name:", name)
console.log("age:", age)

let n1 = toRef(person.age)
console.log("n1:", n1)

在这里插入图片描述

5. ref与reactive对比

  1. ref用来定义:基本类型数据对象类型数据
    reactive用来定义:对象类型数据

  2. 注意点:
    (1) ref创建的变量必须使用.value
    安装插件(vue-official)可提示程序员该不该写value,安装好之后打开Settings
    在这里插入图片描述
    设置后不起作用就重启vscode。在点.的时候,会提示写value

    (2) reactive重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。

    import { reactive } from "vue"
    let car = reactive({ brand: "奔驰", price: 20 })
    function chageCar() {
      // car = { brand: "雅迪", price: 1 } // 这样写页面不更新
      // car = reactive({ brand: "雅迪", price: 1 }) 这样写页面也不更新
      // 以上两种方式 car都已经是一个新对象了,不是响应式对象
      // 采用 Object.assign 可仍保持其为响应式
      Object.assign(car, { brand: "雅迪", price: 1 })
    }
    
  3. 使用原则:
    (1) 若需要一个基本类型的响应式数据,必须使用ref
    (2) 若需要一个响应式对象,层级不深,refreactive都可以。
    (3) 若需要一个响应式对象,且层级较深,推荐使用reactive

总结响应式对象的赋值
ref:

let person = ref({
  name: "tom",
  age: 18,
})
// 对象的地址值发生变化,但是仍旧为响应式
person.value =  { name: "李四", age: 50 }

reactive:

	let car = reactive({ brand: "奔驰", price: 20 })
	car = { brand: "雅迪", price: 1 } // car为新对象,这样写页面不更新
	car = reactive({ brand: "雅迪", price: 1 }) // car为新对象,这样写页面也不更新
// 响应式方法1:修改car整体,但是car地址不变
  Object.assign(car, { brand: "雅迪", price: 1 })	

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

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

相关文章

Matlab R2024B软件安装教程

一、新版本特点 MATLAB R2024B版本带来了众多新特性和改进&#xff0c;旨在提升用户的内容创作体验和工程效率。以下是该版本的一些主要特点&#xff1a; 1. 性能提升和优化&#xff1a;R2024B版本在性能上进行了显著优化&#xff0c;无论是在提问、回答问题、发布新技巧还是…

OpenCV系列教程二:基本图像增强(数值运算)、滤波器(去噪、边缘检测)

文章目录 一、基本图像增强&#xff08;数值运算&#xff09;1.1 加法 &#xff08;cv2.add&#xff09;1.1.1 图像与标量相加&#xff08;调节亮度&#xff09;1.1.2 图像与图像相加&#xff08;两个图像shape要相同&#xff09;1.1.3 图像的加权加法&#xff08;渐变切换&…

nodejs 012:Babel(巴别塔)语言转换与代码兼容

这里写目录标题 安装 Babel配置presets配置&#xff1a;常见的 Babel Presetsplugins配置&#xff1a;以 plugin-transform-class-properties 的类中属性为例index.jsx Babel 是一个独立的 JavaScript 编译器&#xff0c;主要用于将现代 JavaScript 代码转换为旧版本的 JavaScr…

数据结构之二叉树(1)

数据结构之二叉树&#xff08;1&#xff09; 一、树 1、树的概念与结构 &#xff08;1&#xff09;树是一种非线性的数据结构&#xff0c;由n(n>0)个有限结点组成一个具有层次关系的集合。 &#xff08;2&#xff09;树有一个特殊的结点&#xff0c;叫做根结点&#xff…

Linux多块磁盘挂载同一目录

1、背景 由于服务器磁盘空间使用率已经使用占比超过95%&#xff0c;故购买了些磁盘对服务器进行扩容&#xff0c;但是如果直接进行磁盘挂载的&#xff0c;那么就只能挂载一个磁盘挂载一个目录&#xff0c;使用新磁盘空间得不到最大的利用率&#xff0c;故需要将多块磁盘合并为…

【RabbitMQ】死信队列、延迟队列

死信队列 死信&#xff0c;简单理解就是因为种种原因&#xff0c;无法被消费的消息。 有死信&#xff0c;自然就有死信队列。当一个消息在一个队列中变成死信消息之后&#xff0c;就会被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff08;Dead Letter Excha…

sicp每日一题[1.1-1.29]

补一下之前的题目 Exercise 1.1 Below is a sequence of expressions. What is the result printed by the interpreter in response to each expression? Assume that the sequence is to be evaluated in the order in which it is presented. Exercise 1.2 Translate the …

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

Vue2学习笔记(02条件渲染 、监视数据的原理)

1、v-if和v-show的区别 2、Vue监视数据的原理

8.安卓逆向-安卓开发基础-安卓四大组件1

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

Python酷库之旅-第三方库Pandas(122)

目录 一、用法精讲 541、pandas.DataFrame.take方法 541-1、语法 541-2、参数 541-3、功能 541-4、返回值 541-5、说明 541-6、用法 541-6-1、数据准备 541-6-2、代码示例 541-6-3、结果输出 542、pandas.DataFrame.truncate方法 542-1、语法 542-2、参数 542-3…

Linux进阶命令-scp

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

有没有自带财务管理功能的海外仓系统?

在全球化的商业环境中&#xff0c;海外仓作为连接国际市场的物流枢纽&#xff0c;其重要性日益凸显。然而&#xff0c;随着业务范围的扩展和费用类型的多样化&#xff0c;海外仓在财务管理上面临着诸多挑战。传统的手工计费和对账方式不仅耗时费力&#xff0c;而且容易出错&…

常用的k8s容器网络模式有哪些?

常用的k8s容器网络模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI&#xff08;ContainerNetworkInterface&#xff09;模式。K8s的容器网络模式多种多样&#xff0c;每种模式都有其特点和适用场景。Bridge模式适用于简单的容器通信场景&#xff1b;Host模式适用…

将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 阮一峰老师的《ES6入门教程》应该是很多同学学习 ES6 知识的重要参考吧&#xff0c;应该也有很多同学在看该文档的时候&#xff0c;想知道这个教程的前端源码是怎么实现的&#xff0c;也可能有同学下载…

掌握Python-uinput:打造你的输入设备控制大师

文章目录 掌握Python-uinput&#xff1a;打造你的输入设备控制大师背景&#xff1a;为何Python-uinput不可或缺&#xff1f;Python-uinput是什么&#xff1f;如何安装Python-uinput&#xff1f;简单库函数使用方法创建虚拟设备模拟按键模拟鼠标移动模拟滚轮滚动关闭设备 场景应…

IP Source Guard技术原理与应用

目录 IP Source Guard概述 IP Source Guard源数据表项 IP Source Guard源数据-静态添加 IP Source Guard查看 IP Source Guard使用注意事项 IP Source Guard概述 局域网IP冲突给网络的运维带来很大困扰存在以下风险&#xff1a; 使用手工配置IP地址的方式上网&#xff0c…

Redis——C++库redisplusplus在Linux环境下的安装

目录 第一步&#xff0c;安装hiredis第二步&#xff0c;下载redis源码第三步&#xff0c;编译/安装 redis-plus-plus使用redis-plus-plus(以Centos为例)Ubuntu的Makefile 第一步&#xff0c;安装hiredis redis-plus-plus 是基于 hiredis 实现的&#xff0c;而hiredis 是⼀个 C…

【图像检索】基于傅里叶描述子的形状特征图像检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于傅里叶描述子的形状特征图像检索&#xff0c;用matlab实现。 一、案例背景和算法…

企业数字化底座与数字化转型方案(可编辑的81页PPT)

方案介绍&#xff1a;在当今数字化转型的浪潮中&#xff0c;企业数字化底座与数字化转型方案是企业应对市场变化、提升竞争力的关键举措。通过构建数字化底座&#xff0c;实现数据的集中管理和共享&#xff1b;通过数字化转型方案的实施&#xff0c;推动企业的全面数字化改造。…