vue3基础

141.用vite创建vue3项目

142.项目目录

vue3中,直接导入组件就能用

不再要求唯一根元素

//createApp(App)是创建实例,.mount('#app')是在将实例往id为app的盒子上挂载
createApp(App).mount('#app')//挂载就是让实例接管一片区域

assets是存放图片或样式的目录

143.组合式API--setup选项

执行时机在beforeCreate之前
测试代码:

<script>
export default {setup(){console.log("setup函数")},beforeCreate() {console.log('beforeCreate函数')}
}
</script>

控制台输出:

可以看出setup函数的执行时机在beforeCreate之前

vue3基本不用this

2.setup函数里面定义的数据或者函数要想在界面中使用,需要return

setup(){//数据const message ='hello'//函数const logMessage =()=>{console.log(message)}return{message,logMessage}},

只要return了就能直接在界面中使用


<template><div>{{message}}</div><button @click="logMessage"></button>
</template>

 语法糖:这样就简化了代码,不再需要return,只要在<script setup>标签里面添加数据和函数就能直接在界面中使用

<script setup>//数据const message ='hello'//函数const logMessage =()=>{console.log(message)}// console.log("setup函数")
</script>

3.reactive:接收一个对象类型的数据,返回一个响应式的对象

响应式的对象指的是当数据改变时,前端界面上显示的数据也随之改变

<script setup>
//reactive:接收一个对象类型的数据,返回一个响应式的对象
import {reactive} from "vue";const user = reactive({count:100
})
const setCount = ()=>{user.count++;
}
</script><template><div><div>{{user.count}}</div><button @click="setCount">加一</button></div>
</template>

4.ref,接收简单类型或者复杂类型,返回一个响应式的对象

<script setup>
import {ref} from "vue";
const count = ref(0)const  setCount =()=>{count.value++
}//这里使用ref得到响应式对象后,要打印count的话要用.value才能得到count的值
console.log(count.value)
//但是在标签里面不用.value,直接count即可//ref的原理就是将普通对象包装成复杂对象,并使用了reactive使其能响应式更新</script><template><div><div>{{count}}</div><button @click="setCount">加一</button></div></template>

推荐以后都使用ref,因为他既能接受简单类型又能接受复杂类型

144.computed

<script setup>
//const 计算属性
import {computed,ref} from "vue";
//声明数据
const list = ref([1,2,3,4,5])//基于list派生出一个计算属性,从list中过滤出大于2的所有数const  computedList = computed(()=>{return list.value.filter(item=>item>2)
})const add=()=>{list.value.push(666);
}
</script>
<template><div><div>{{list}}</div><div>{{computedList}}</div><button @click="add">加666</button></div>
</template>

计算属性的优点是它们可以缓存计算结果,并且只在依赖数据发生变化时才重新计算。这有助于提高性能,并避免不必要的重复计算。

在使用computedList时,你可以像使用普通属性一样访问它,在模板中进行绑定或在JavaScript代码中读取它。每当list的值发生变化时,computedList会自动更新并提供最新的计算结果。

146.watch侦听器

语法:

// 1.监听单个数据的变化
// watch(ref对象,newValue,oldValue)=>{ 
//})

//2.监听多个数据的变化
//watch([ref对象1,ref对象2],(newArr,oldArr)=>{
// })
//3.immediate 立即执行
// watch(count,(newValue,oldValue)=>{
//   console.log(newValue,oldValue);
// },{
//immediate:true,
//})//4.deep深度监视
//默认watch进行的是浅层监视
//const ref = ref(简单类型) 可以直接监视//但是如果是复杂类型,就要使用deep属性进行升读监视
// watch(count,(newValue,oldValue)=>{
//   console.log(newValue,oldValue);
// },{
//immediate:true,
//deep:true
//})

5.不开启deep,直接监视复杂类型的某个属性,语法:
watch(()=>user.value.age,(newValue,oldValue)=>{console.log(newValue,oldValue)
})

代码示例

<script setup>
import {ref,watch} from "vue";
const  count = ref(0);
const name = ref("宁是");
const  add=()=>{count.value++;
}
const setName =()=>{name.value="李四"
}// 1.监听单个数据的变化
// watch(ref对象,newValue,oldValue)
// watch(count,(newValue,oldValue)=>{
//   console.log(newValue,oldValue);
// })//2.监听多个数据的变化
//watch([ref对象1,ref对象2],(newArr,oldArr)=>{
// })watch([count,name],(newArr,oldArr)=>{console.log(newArr,oldArr)
})
</script><template><div>数量:{{count}}</div><button @click="add">加一</button><div>姓名:{{name}}</div><button @click="setName">修改</button>
</template>

148.父子组件通信

父组件数据传到子组件:

1.在父组件中给子组件自定义属性并赋值

2.在子组件中使用defineProps来接受

3.此时就能使用父组件传过来的数据了,不过要注意:

//对于props得到的数据,在script里面要用props.car获取数据

//而模块中直接用car即可

子组件:

const  props = defineProps({car:String,money:Number
})
console.log(props.car)
console.log(props.money)

子组件改变父组件数据

1.父组件给子组件绑定事件,如果触发此事件就执行某方法

<SonCom
//此处就是绑定了changeMoney方法,会执行changeFn方法@changeMoney = "changeFn"car="保安吗" :money="money">
</SonCom>

2.在子组件中用defineEmits注册事件

const emit = defineEmits('changeMoney')

注册完事件后就能在方法里面使用emit通知父组件更新数据了

const  buy=()=>{//需要emit触发事件
emit('changeMoney',5)
}

事件名是changeMoney,参数是5

父子通信完整代码演示

父组件:

<script setup>import SonCom from '@/components/son-com.vue'
import {ref} from "vue";const money = ref(100)
const addMoney =()=>{money.value+=10;
}const changeFn =(newMoney)=>{money.value = money.value-newMoney
}
</script><template><div><h3>父组件</h3>
<!--    给子组件以添加属性的方式传值--><SonCom@changeMoney = "changeFn"car="保安吗" :money="money"></SonCom><button @click="addMoney">挣钱</button></div>
</template>

子组件:

<script setup>
const  props = defineProps({car:String,money:Number
})
//对于props得到的数据,在script里面要用props.car获取数据
//而组件中直接用car即可console.log(props.car)
console.log(props.money)
//defineEmits里面的数组填写的是需要触发的事件,事件定义好了才能触发const emit = defineEmits('changeMoney')const  buy=()=>{//需要emit触发事件
emit('changeMoney',5)
}
</script>
<template>
<div> 我是子组件-{{car}}--{{money}}
<button @click="buy">花钱</button>
</div>
</template><style scoped></style>

149.模板引用和defineExpose

引用dom元素:

1.使用ref生成一个ref对象

const inp = ref(null);

2.在模板中给元素添加属性

 <input ref="inp" type="text">

此时就绑定成功了

通过inp.value.focus()能让输入框聚焦

代码示例

父组件:

<script setup>import TestCom from "@/components/test-com.vue";
import {ref} from "vue";//1.调用ref函数,生成一个ref对象
//2.通过ref标识,进行绑定
//3.通过ref对象,value即可访问到绑定的元素
const inp = ref(null);const clickFn =()=>{inp.value.focus()
}
</script><template><div><input ref="inp" type="text"><button @click="clickFn">点击使输入框聚焦</button></div><TestCom></TestCom>
</template>

子组件:

<script setup>
const count =999;
const sayHi=()=>{console.log("打招呼")
}defineExpose({count,sayHi
})
</script><template></template>

150.跨级传递数据,用procide传递,用inject接收

注意:孙子或者更低的组件得到高级组件传递的数据后,不能直接更改它的值

要想更改它的值,可以让高级组件将修改它的值的方法也传递过来

顶级组件:

<script setup>
import {inject} from "vue";
const themeColor = inject('theme-color')
const count = inject('count')
const setCount =inject('setCount')
const clickFn=()=>{setCount(666);
}
</script><template><div><h3>我是底层组件-{{themeColor}}--{{count}}</h3><button @click="clickFn">修改Count</button></div>
</template>

中级组件:

<script setup>
import BottonCom from "@/components/botton-com.vue";
</script><template><div><h2>我是中间组件</h2><botton-com></botton-com></div>
</template>

底层组件:

<script setup>
import {inject} from "vue";
const themeColor = inject('theme-color')
const count = inject('count')
const setCount =inject('setCount')
const clickFn=()=>{setCount(666);
}
</script><template><div><h3>我是底层组件-{{themeColor}}--{{count}}</h3><button @click="clickFn">修改Count</button></div>
</template>

151.defineOptions

152.defineModel

 155.Pinia-最新的状态管理工具

使用Pinia

1.npm install pinia

2.在自己创建的js文件(如counter.js)里面导入Pinia

import {defineStore} from "pinia";

3.创建并导出一个状态管理函数(函数名以use开头),这个函数里面就是仓库内容,(可以声明数据,声明操作数据的方法,声明基于数据派生的计算属性)

记得一定要return

export const useCounterStore=defineStore('counter',()=>{//声明数据//第一个数据const count = ref(0)//声明操作数据的方法const addCount=()=>count.value++const subCount=()=>count.value--//声明基于数据派生的计算属性const getDoubleCount = computed(()=>count.value*2)//第二个数据const msg = ref('hello')//只有return出去后,才能被页面使用return{count,msg,addCount,subCount,getDoubleCount}
})

export导出后就能在其他组件中使用了

4.其他组件中使用:

import {useCounterStore}from'@/store/counter'
const counterStore = useCounterStore()

将这个状态管理函数导入即可,使用就直接用'  . '来调用变量或者方法

如:

<template><h3>子组件1  {{counterStore.count}} - {{counterStore.getDoubleCount}}</h3><button @click="counterStore.addCount()">+</button>
</template>

counterStore.count 和counterStore.getDoubleCount都是从状态管理函数的返回值得到的

156.Pinia的异步方法

export const useChannelStore =defineStore('channel',()=>{//声明数据const channelList = ref([])const getList = async ()=>{const {data:{data}} =await axios.get('https://geek.itheima.net/v1_0/channels')channelList.value = data.channels}return{channelList,getList}
})

res默认会包装一层

158.Pinia-持久化

1.安装pinia-plugin-persistedstate

npm i pinia-plugin-persistedstate

2.在main.js里面导入

import persist from 'pinia-plugin-persistedstate'

app.use(createPinia().use(persist))

3.在store仓库中(就是一个用来保存数据的js文件)加一条属性

persist : true

import {defineStore} from "pinia";
import {computed, ref} from "vue";
import persist from "pinia-plugin-persistedstate";//定义store
//defineStore(仓库的唯一标识(填名字就行),()=>{...})export const useCounterStore=defineStore('counter',()=>{//声明数据//第一个数据const count = ref(0)//声明操作数据的方法const addCount=()=>count.value++const subCount=()=>count.value--//声明基于数据派生的计算属性const getDoubleCount = computed(()=>count.value*2)//第二个数据const msg = ref('hello')//只有return出去后,才能被页面使用return{count,msg,addCount,subCount,getDoubleCount}
},{persist:true
})

这样,该counter里面的数据就会被自动存入本地存储

其中,这一句

export const useCounterStore=defineStore('counter',()=>{

里面的counter就是存本地存储的键名

拓展:

1.修改key

persist:{key:'nsy-counter'
}

2.更改storage

persist:{key:'nsy-counter',storage:sessionStorage
}

3.指定需要进行持久化的数据

(默认是stage里面的所有数据都持久化)

persist:{key:'nsy-counter',storage:sessionStorage,paths:['count']
}

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

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

相关文章

uniapp——实现二维码生成+保存二维码图片——基础积累

最近在做二维码推广功能&#xff0c;自从2020年下半年到今天&#xff0c;大概有三年没有用过uniapp了&#xff0c;而且我之前用uniapp开发的程序还比较少&#xff0c;因此很多功能都浪费了很多时间去查资料&#xff0c;现在把功能记录一下。 这里写目录标题 效果图1.根据接口返…

Vue Mock.js介绍和使用与首页导航栏左侧菜单搭建

前言&#xff1a; 因为使用Vue开发&#xff0c;组件写的太多&#xff0c;组件与组件之间的传递数据复杂&#xff0c;所以要用到Mock和Bus事件 一&#xff0c;关于Mock 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器&#xff0c;用来帮助前端调试开发、进行前后端的原型分离…

ctfshow 命令执行 (29-39)

学习参考的 https://www.cnblogs.com/NPFS/p/13279815.html 说的很全面 web29 命令执行&#xff0c;需要严格的过滤 源码 error_reporting(0); if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){eval($c);}}else{highlight_file(__FILE__); } …

深入浅出Java的多线程编程——第一篇

目录 1. 认识线程&#xff08;Thread&#xff09; 1.1 概念 1.1.1 线程是什么 1.1.2 为啥需要线程 1.1.3 进程和线程的区别 1.1.4 Java的线程和操作系统线程的关系 1.2 第一个多线程程序 1.3 创建线程的方式&#xff08;5种&#xff09; 1.3.1 继承Thread类 1.3.2 实现…

Spring面试题21:说一说Spring的@Required注解和@Qualifier注解

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的@Required注解 @Required ,用于标记在注入的属性上。它表示被注解的属性在配置 Bean 的时候是必需的,如果没有正确配置,则会抛出…

go字符串拼接方式及性能比拼

在golang中字符串的拼接方式有多种&#xff0c;本文将会介绍比较常用的几种方式&#xff0c;并且对各种方式进行压测&#xff0c;以此来得到在不同场景下更适合使用的方案。 文章目录 1、go字符串的几种拼接方式1.1 fmt.Sprintf1.2 运算符拼接1.3 strings.Join1.4 strings.Bui…

【从0学习Solidity】45. 时间锁

【从0学习Solidity】45. 时间锁 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开…

关于vantUI的导航组件tab标签页在ios和安卓中运用遇到的坑

vantTab的默认值 应用场景问题描述原始代码更正代码 应用场景 根据路由传值设置默认tab页&#xff0c;获取不同的数据并进行展示 问题描述 ios可正常按照路由传值默认tab页&#xff0c;安卓始终默认tabList的第一个value值&#xff0c;疑安卓系统中不接受dataMap.tabActive为…

YOLOv5如何训练自己的数据集(生活垃圾数据集为例)

文章目录 前言1、数据标注说明2、定义自己模型文件3、训练模型参考文献 前言 本文主要介绍如何利用YOLOv5训练自己的数据集 1、数据标注说明 以生活垃圾数据集为例子 生活垃圾数据集&#xff08;YOLO版&#xff09;点击这里直接下载本文生活垃圾数据集 生活垃圾数据集组成&…

Python开发与应用实验2 | Python基础语法应用

*本文是博主对学校专业课Python各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 &a…

【JavaEE】多线程案例-线程池

文章目录 1. 什么是线程池2. 为什么要使用线程池&#xff08;线程池有什么优点&#xff09;3. 如何使用Java标准库提供的线程池3.1 创建一个线程池对象3.2 什么是工厂模式3.3 为什么要使用工厂模式3.4 Executors 创建不同具有不同特性的线程池3.5 ThreadPool 类的构造方法3.6 线…

C++之list成员函数应用总结(二百三十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Neo4j 与 Cypher 基础

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 简介 Neo4j 是用 Java 实现的开源 NoSQL 图数据库。从2003年开始开发&#xff0c;2007年正式发布第一版&#xff0c;其源码托管于 GitHub。 与常见的关系型数据库不同&#xff0c;Neo4j 基于图图结构来表示…

学习:原码-反码-补码

文章目录 前提知识原码详解反码补码 二进制负数的运算 前提知识 正数不需要进行原码反码补码一说&#xff0c;正数就是正数&#xff0c;我们原码反码补码是为了针对负数 &#xff08;按道理来说其实根本不存在什么码&#xff0c;只有二进制机器码&#xff0c;不过是为了方便计…

华为云云耀云服务器L实例评测|华为云上安装etcd

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上安装etcd一、什么是etcd官方硬件建议 二、华为云主机准备三、etcd安装1. 安装预构建的二进制文件2. 从源代码构建 四、etcd服务注册与发现1. 配置etcd2. 使用systemctl 管理启动etcd服务3. 注册服务4. 发现服务 五、其…

ISE_ChipScope Pro的使用

1.ChipScope Pro Core Inserter 使用流程 在之前以及编译好的流水灯实验上进行学习 ChipScope的使用。 一、新建一个ChipScope 核 点击Next,然后在下一个框中选择 Finish&#xff0c;你就会在项目菜单中看到有XX.cdc核文件。 二、对核文件进行设置 右键“Synthesize – XST” …

最快的包管理器--pnpm创建vue项目完整步骤

1.用npm全局安装pnpm npm install -g pnpm 2.在要创建vue项目的包下进入cmd&#xff0c;输入&#xff1a; pnpm create vue 3.输入项目名字&#xff0c;选择Router,Pinia,ESLint,Prettier之后点确定 4.cd到创建好的项目 &#xff0c;安装依赖 cd .\刚创建好的项目名称\ p…

怎样快速打开github.com

1访问这个网站很慢是因为有DNS污染&#xff0c;被一些别有用心的人搞了鬼了&#xff0c; 2还有一个重要原因是不同的DNS服务器解析的速度不一样。 1 建议设置dns地址为114.114.114.114.我觉得假设一个县城如果有一个DNS服务器的话&#xff0c;这个服务器很可能不会存储…

[linux]服务器挂代理提升下载权重速度

写在前面 这里主要以huggingface下载权重为例&#xff0c;介绍如何在linux中部署代理提升下载速度 实际操作 第一步&#xff1a;服务器安装clash文件 https://github.com/Dreamacro/clash/releases#下载clash链接第二步&#xff1a;使用自己的配置文件 将config.yaml替换掉…

前端项目练习(练习-003-webpack-01)

学习webpack前&#xff0c;首先&#xff0c;创建一个web-003项目&#xff0c;内容和web-002一样。&#xff08;注意将package.json中的name改为web-003&#xff09; 想想&#xff0c;我们开发Java 的时候&#xff0c;Maven帮我们做的主要是编译&#xff0c;打包等等内容。开发前…