Vue2,Vue3知识大全
Vue
1.了解vue,快速上手
-
vue是一个用于构建用户的界面的渐进式框架.
-
vue的两种使用方法:
-
vue核心包开发 场景:局部模块改造
-
vue核心包&vue插件 工程化开发 场景:整站开发
1.创建一个vue实例:
2.插值表达式
1.插值表达式是一种Vue的模版语法
-
作用:利用表达式进行插值,渲染到页面中
-
表达式:是可以被求值的代码,Js引擎会将其计算出一个结果
-
语法:{{ 表达式 }}
2.注意点
-
使用的数据必须存在(data)
-
支持的是表达式,而非语句,比如:if for…..
-
不能在标签属性中使用{{ }}插值
我是标签
3.响应式特征
1.访问数据:实例.属性名
app.msg
2.修改数据:实例.属性名=值
app.msg=‘你好,Vue’
4.开发者工具
vue插件:极简插件官网_Chrome插件下载_Chrome浏览器应用商店
5.Vue指令
Vue会根据不同的[指令],针对标签实现不同的[功能]
指令:带有v- 前缀的特殊标签属
v-show
-
作用:控制元素的显示和隐藏
-
语法:v-show=“表达式”,表达式值true显示,false隐藏
-
原理:切换display:none控制隐藏显示
-
场景:频繁切换显示隐藏的场景
v-if
-
作用:控制元素的显示和隐藏(条件渲染)
-
语法:v-if=“表达式”,表达式值true显示,false隐藏
-
原理:基于判断条件,是否创建或移除元素节点
-
场景:要么显示,要么隐藏,不频繁切换的场景
v-on(可以替换为@)
-
作用:注册事件=添加监听+提供处理逻辑
-
语法:
-
v-on:事件名=“内联语句”
-
v-on:事件名=“methods中的函数名”
v-on调用传参
v-bind
-
作用:动态设置html的标签属性->src url title….
-
语法:v-bild:属性名=“表达式”
-
简写: :属性名=“表达式”
v-bind对样式控制的增强
-
为了方便开发者进行样式控制,Vue扩展了v-bind的语法,可以针对class和style行内样式进行控制
-
v-bind对于样式控制的增强–操作class
-
语法:class=“对象/数组”
-
对象–>键就是类名,值就是布尔值,如果值为true,有这个类,反之
<div class="box" :class="{类名1:布尔值,类名2:布尔值}"></div>
-
数组–>数组中的所有的类,都会添加到盒子上,本质就是一个class列表
<div class="box" :class="[类名1,类名2,类名3]"></div>
-
v-bind对于样式控制的增强–操作style
-
语法:style=“样式对象”
<div class="box" :style="{css属性名1:css属性值,css属性名2:css属性值}"></div>
v-for
-
作用:基于数据循环,多次渲染整个元素
-
遍历数组: v-for”(item,index) in 数组”——–item(每一项),index(下标)(可以自己命名)
filter(不会改变原数组):根据条件,保留满足条件的对应项,得到一个新数组
v-key
-
语法:key属性=“唯一标识符”
-
作用:给列表添加的唯一标识,便于VUe进行Vue进行列表项的正确排序复用
注意:
-
key的值只能是字符串或数字类型
-
key的值必须是具有唯一性的
-
推荐使用id作为key(唯一),不推荐使用index作为key(会变化,不对应)
v-model
-
作用:给表单元素使用,双向数据绑定,可以快速获取或设置表单元素内容
-
数据变化–>视图自动更新
-
视图变化–>数据自动更新
-
语法:v-model=‘变量’
v-model应用于其他表单元素
-
常见的表单元素都可以用v-model绑定关联–>快速获取或设置表单元素的值
-
它会根据控制类型自动选取正确的方法来更新元素
6.指令修饰符
-
通过“.”指明一些指令后缀,不同后缀封装了不同的处理操作–>简化代码
-
按键修饰符
-
@keyup.enter —>键盘回车监听
-
v-model修饰符
-
v-model.trim—->去除首尾空格
-
v-model.number—>转数字
-
事件修饰符
-
@事件名.stop—>阻止冒泡
-
@事件名.prevent—>阻止默认行为
7.计算属性
-
基于现有的数据,计算出来的新属性,依赖的数据变化
-
语法:
-
声明computed配置项中,一个计算属性对应一个函数
-
使用起来和普通属性一样使用(( 计算属性名 ))
计算机属性的完整写法
-
计算机默认属性的简写,只能读取访问,不能修改
-
如果要修改,需要写计算机的完整写法
8.watch监听器
-
监视数据,执行一些业务逻辑或异步操作
语法:
-
简单写法:简单数据类型,直接监听
-
完整写法:添加额外配置项
-
deep:true 对复杂类型深度监视
-
immediate:true 初始化立即执行一次handler方法
9.生命周期
vue生命周期:一个vue实例从创建到销毁的整个过程
生命周期的是个阶段:1.创建2.挂载3.更新4.销毁
10.工程化开发
11.组件的三大组成部分
-
结构:template(只有一个根元素)
-
样式:style(全局样式(默认):影响所有局部样式:scoped下样式,只作用于当前组件)
-
逻辑:script(el根实例独有,data是一个函数,其他配置项一致)
12.组件通信
组件通信,就是指组件与组件之间的数据传递
-
组件的数据是独立的,无法直接访问其他组件的数据
-
想用其他组件的数据->组件通信
组件关系:
-
父子关系(props,$emit
-
非父子关系(provide&inject ,eventbus)
props校验
为组件的prop指定验证要求,不符合要求,控制台就会执行错误
-
类型校验
基础写法(只有类型校验)
props:{
校验的属性名:类型
}
完整写法:
props:{校验的属性名:{type:类型, //Number,String,Booleanrequrie:true, //是否必填default:默认值, //默认值validator(value){//自定义校验逻辑return 是否通过校验}}}
非父子通信
13.v-model原理
原理:v-model本质是一个语法糖.例如应用在输入框上,就是value属性和input事件的合写
作用:提供数据的双向绑定
-
数据变,视图跟着变:value
-
视图变,数据跟着变 @input
<input v-model="msg" type="text">等价于<input :v-model="msg" @input="msg=$event.target.value" type="text">
表单类组件封装&v-model简化代码
-
表单类组件封装
-
父传子:数据 应该是父组件 props传递过来的,v-model拆解绑定数据
-
子传父:监听输入,子传父传值给父组件修改
-
父组件-model简化代码,实现子组件和父组件数据双向绑定
-
子组件中:props通过value接收,事件触发input
-
父组件中:v-model给组件直接绑定数据
14 .sync修饰符
作用:提供数据的双向绑定,可以实现子组件与父组件数据的双向绑定
特点:prop属性名,可以自己定义,非固定的value
15.ref和$refs
作用:利用ref和$refs可以用于获取dom元素,或组件实例
特点:查找范围->当前组件内(更精确温度)
-
获取dom:
-
目标标签-添加ref属性
-
恰当时机,通过this.$refs.XXX,获取目标标签
-
获取组件:
-
目标组件-添加ref属性
-
恰当时机,通过this.$refs.XXX,获取目标组件,就可以调用组件对象里面的方法
this.$ref.baseForm.组件方法()
16.Vue异步更新.$nextTick
需求:编辑标题,编辑框自动对焦
-
点击编辑,显示编辑框
-
让编辑框,立刻获取焦点
this.isShowEdit=true//显示输入框this.$nextTick(()=>{this.$ref.inp.fouse()})//获取焦点
day-05
1.自定义指令
-
自定义命令:自己定义的指令,可以封装一些dom操作,扩展额外功能
-
全局注册-语法
Vue.directive('指令名',{"inserted"(el){el.fouse()}})
-
局部注册-语法
directives:{"指令名":{inserted(){el.focus()}}}
自定义指令-指令的值
需求:实现一个color指令-传入不同的颜色,给标签设置文字颜色
-
语法:在绑定指令时,可以通过“等号”的形似为指令绑定具体的参数
<div v-color="color">我是内容</div>
-
通过binding.value可以拿到指令值,指令值修改会触发update函数
directives:{color:{inserted(el,binding) {el.style.color=binding.value},update(el,binding){el.style.color=binding.value}}}
自定义指令 v-loading指令封装
2.插槽
插槽-默认插槽
作用:让组件内部的一些结构支持自定义
插槽基本语法:
-
组件内需要的定制的结构部分,改用<slot></slot>占位
-
使用组件时,<MyDialog></MyDialog>(引入的)标签内部,传入结构替换slot
插槽-后备内容(默认值)
插槽后备内容:封装组件时,可以为预留的<slot>插槽提供后备内容
-
语法:在<slot>标签内,放置内容,作为默认显示内容
插槽-具名插槽
具名插槽语法:
-
多个slot使用name属性名区分名字
-
template配合v-solt:名字 来分发对应标签
插槽-作用域插槽
基本使用步骤:
-
给solt标签,以添加属性的方式传值
<solt :id="item.id" msg="测试文本"></solt>
-
所有添加的属性,都会被收集到一个对象中
{id:3,msg="测试文本"}
-
在template中,通过“#插槽名=”obj””接收,默认插槽为default
<MyTable :list="list"><template #default="obj"><button @click="del(obj.id)">删除</button></template></MyTable>
3.单页应用程序:SpA-Single Page Application
单页面应用(SPA):所用功能在一个html页面实现
-
单页程序
-
多页程序
4.路由
-
根据路由就知道不同路径的,应该匹配渲染哪个组件
vue中的路由:路径和组件的映射关系
1.vueRouter
-
作用:修改地址栏路径时,切换显示匹配的组件
-
Vue官方的一个路由插件,是一个第三方包
-
官网:Vue Router
vueRouter的使用(5+2)
-
下载:下载VueRouter模块到当前工程,版本3.6.5
npm add vue-router@3.6.5
-
引入
import VueRouter from 'vue-router'
-
安装注册
Vue.use(VueRouter)
-
创建路由对象
const router=new VueRouter
-
注入,将路由对象注入到new Vue实例中,建立关联
new Vue({render:h=>h(App),router}).$mount('#app')
2个核心项目
-
创建需要的组件(views目录),配置路由规则
eg:
-
配置导航,配置路由出口(路径匹配的组件显示的位置)
2.路由的封装抽离
目的:将路由模块抽离出来.拆分模块,利于维护。
3.router-link(代替a标签)
-
能跳转,配置to属性指定路径(必须)。本质还是a标签,to无需要#
-
能高亮,默认就会提供高亮类名,可以直接设置高亮样式
高亮:
router-link-active 模糊匹配(用的多)
router-link-exavt-active 精准匹配
4.声明式导航-跳转传参
1.查询参数传参
-
语法格式如下:
-
to=“/path?参数名=值”
-
对用页面组件接收传递过来的值
-
$route.query.参数名
2.动态路由传参:
-
配置动态路由
-
const router=new VenRouter({routes:[...,{path:'/ssearch/:words',component:Search}]})
-
配置导航链接
-
to=“/path/参数值”
-
对应页面组件接收传递过来的值
-
$route.params.参数名
5.vue路由-重定向
说明:重定向->匹配path后,强制跳转path路径
语法:{path:匹配路劲,redirect:重定向到的路径}
6.vue路由-404
位置:配在路由的最后
语法:path:“*”(任意路径)-前面不匹配就命中最后这个
7.Vue路由-模式设置
-
hash路由(默认) 网址有#号
-
history路由(常用) 无#号
const router=new VueRouter({routes,mode:"history"})
5.编程式导航-基本跳转
编程式导航:用js代码来进行跳转
两种语法:
-
path路径跳转(简单方便)
-
this.$router.push('路由路径')eg:this.$router.push('/search')
-
this.$router.push({path:'路由路径'})eg:this.$router.push({path:'/search'})
-
name命名路由跳转(适合path路径长的场景)
-
this.$router.push({name:'路由名'}){name:'路由名',path:'/path/XXX',component:XXX},
编程式导航-路由传参
两种转跳方式,对于两种传参方式都支持
-
path路径跳转传参(query传参)
//简写this.$router.push('/路径/?参数名1=参数值&参数2=参数值')//完成写法this.$router.push({path:'/路径',query:{参数名1:'参数值1',参数名2:'参数值'2,}})------------------------接收:$router.query.参数名
path路径跳转传参(动态路由传参)
//简写this.$router.push('/路径/参数值')//完整写法this.$router.push({path:'/路径/参数值'})----------------------获取参数$router.params.参数名
-
name命名路由由转跳传参(query传参)
this.$router.push({name:'路由名字',query:{参数名1:'参数值1'参数名2:'参数值2'}}----------------------------//接收$router.query.参数名
name命名路由由转跳传参(动态路由传参)
this,$router.push({name:'路由名字',params:{参数名:'参数值',}})------------------------//接收$router.params.参数名
6.组件缓冲keep-alive
-
keep-alive是vue的内置组件,当它包装动态组件时,会缓存不活动的组件实例,而不是销毁
三个属性:
include:组件名数组,只有匹配的组件才会缓存exclude:组件名数组,任何匹配的组件都不会缓存max:最多可以缓存多少组件实例
day-06
1.自定义创建项目
步骤如下:
2.ESlint代码规范
代码规范:JavaScript Standard Style
代码错误含义:[ESLint 规则表]
day-07
1.vuex的基本认识
-
vuex是一个插件,可以帮我们管理vue通用的数据(多组件共享的数据)
1.1构建vuex多组件数据共享环境
一、
-
创建项目:
vue creat vuex-demo(自定义)
-
创建三个组件,
-components--son1.vue--son2.vue-App.vue
-
代码
二、
-
安装vuex
npm add vuex@3
-
新建vuex模块文件
-
新建store/index.js专门存放vuex
-
创建仓库
-
Vue.use(Vuex)创建仓库 new Vuex.Store()
-
main.js导入挂载
-
在main.js中导入挂载到Vue实例上
1.2核心概念-state状态
-
State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。
使用数据:
-
通过store直接访问
-
通过辅助函数(简化)
mapState是辅助函数,帮助我们把store中的数据自动映射到组件的计算属性中
1.3核心概念-mutations
-
明确vuex同样遵循单项数据流,组件中不能直接修改仓库的数据
-
strict:true 可以开启严格模式
state数据的修改只能通过mutations
1.定义mutations对象,对象中存放修改state的方法
const store =new Vuex.store({state:{count:0},mutations:{addCount(state){state.count+=1}}})
2.组件中提交调用mutations
this.$store.commit('addCounnt')
mutations传参语法
提交mytation函数
mutations:{....addCount(state,n){state.count+=n}}
2.辅助函数-mapMuatations
-
mapMutations它是把位于mutations中的方法提取出来,映射到组件methods中
3.核心概念-actions
-
处理异步操作
mutations:{changeCount(state,newCount){state.count=newCount}}//-------------//提供方法actions:{setAsynCount(contaxt,num){setTimeout(()=>{context.commit('changeCount',num)},1000)}}//页面中dispath调用this.$store.dispathch('setAsyncCount',200)
4.辅助函数-mapActions
-
mapAction是把位于actions中的方法提取出来,映射到组件methods中
4.核心概念-getters
-
从state中派生出的一些状态,这些状态是依赖state的,此时会用到getters
注意:
1.定义getters
getters函数的第一个参数是state
getters函数必须有返回值
2.访问getters
通过store访问
{{$store.getters.gilterList}}
通过辅助函数mapGetters映射
computed:{...mapGetters(['filterList'])},----------------------------{{filterList}}
5.核心概念-模块module
使用模块数据:
-
直接通过模块名访问:
$store.state.模块名.xxx
2.通过mapState映射
默认根据级别的映射:mapState(['xxx'])子模块的映射:mapState('模块名',['xxx'])----需要开启命名空间
使用getters中的数据
直接访问:$store.getters['模块名/xxx']
2.通过mapGetters映射
默认根据级别的映射:mapGetters(['xxx'])子模块的映射:mapGetters('模块名',['xxx'])----需要开启命名空间
6.vant组件库
https://vant-contrib.gitee.io/vant/v2/#/zh-CN/
npm安装:
npm i vant@latest -v2 -S
按需导入:
7.项目中vw适配
安装:
npm i postcss-px-to-viewport@1.1.1 -D
vue3
-
creat-vue是Vue官方新的脚手架,底层切换成vite(下一代构建工具)
使用create-vue创建项目
-
安装Node.js
-
创建一个Vue应用
npm init vue@latest
1.组合式API-setup
setup每次使用都要return 太麻烦了
<scipt setup>语法(不需要写return)
<script setup>//数据const messgae=''//函数const logMessage=()=>{}</script>
2.组合式API-reactive和ref函数
reactive()
作用:接受对象类型数据的参数传入并返回一个响应式的对象
核心步骤 :
-
从vue包中导入reactive函数
-
在<script setup>中执行reactive函数并传入类型为对象的初始值,并使用变量接受返回值
<script setup>//导入import {reactive} from 'vue'//执行函数 传入参数 变量接受const state=reactive(对象类型数据)</script>
<script setup>import {reactive} from 'vue';const state=reactive({count:100})const setAdd=()=>{state.count++}</script><template><div><div>{{ state.count }}</div><button @click="setAdd">+1</button></div></template>
ref()
作用:接受简单类型或者对象类型的数据传入并返回一个响应式的对象
核心步骤 :
-
从vue包中导入ref函数
-
在<script setup>中执行ref函数并传入初始值,并使用变量接受ref函数的返回值
<script setup>//导入import {ref} from 'vue'//执行函数 传入参数 变量接受const count=ref(简单类型或者复杂类型数据)</script>
注意点:
-
脚本中访问数据,需要通过 .value
-
在template中,.value不需要加
<script setup>import {ref} from 'vue'const count=ref(0)const setCount=()=>{count.value++ ********}</script><template><div><div>{{count}}</div>******<button @click="setCount">+1</button></div></template>
3.组合式API-computed
计算属性基本思想和vue2完全一致,组合式API下的计算属性只修改了写法
核心步骤:
-
导入computed函数
-
执行函数在回调参数中return基于响应式数据做计算的值,用变量接收
<script setup>import {computed,ref} from 'vue'const list=ref([1,2,3,4,5,6,7,8,9])//基于list派生一个计算属性,从list中过滤const computedList=computed(()=>{return list.value.filter(item=>item>2)})</script>//定义一个修改数组的方法const addFn=()=>{list.value.push(66)}<template><div><div>原始数据{{list}}</div>-----1,2,3,4,5,6,7,8,9<div>computed计算后的数据:{{computedList}}</div>----3,4,5,6,7,8,9<button @click="addFn">修改</button></div></template>
4.组合是API-watch
作用:侦听一个或者多个数据的变化,数据变化是执行回调函数
核心步骤:
-
导入watch函数
-
执行watch函数传入要侦听的响应式数据(ref对象)和回调函数
<script setup>import {ref,watch} from 'vue'const count=ref(0)const nickname=ref('张三')const changeCount=()=>{count.value++}const changenickname=()=>{nickname.value='李四'}--------------------------------------------------------------------//监听一个数据的变化//watch(ref对象,(newvalue,oldvalue)=>{.......})watch(count,(newValue,oldValue)=>{console.log(newValue,oldValue)},{immediate:true})--------------------------------------------------------------------//监听多个数据的变化//watch([ref对象1,ref对象2],(newvalue,oldvalue)=>{.......})watch([count,nickname],(newValue,oldValue)=>{console.log(newValue,oldValue)})--------------------------------------------------------------------</script><template><div>{{count}}</div><button @click="changeCount">改数字</button><div>{{nickname}}</div><button @click="changenickname">改名字</button></template>
immediate
在侦听器创建时立即触发回调,响应式数据变化之后继续执行回调
deep
深度监视,默认的watch为浅层监视
const ref1=ref(简单类型) 可以直接监视
const ref2=ref(复杂类型) 监视不到复杂类型内部数据的变化
const userInfo=ref({name:'zs',age:18})const setUserInfo=()=>{uesrInfo.value.age++}watch(userInfo,(newValue)=>{consolg.log(newValue)},{deep:true})
精确侦听对象的某个属性
在不开启deep的前提下,侦听age变化,只有zge变化是才执行回调
const userInfo=ref({name:'zs',age:18})const setUserInfo=()=>{uesrInfo.value.age++}//只有age变化才监听watch(()=>userInfo.value.age,(newValue,oldValue)=>{console.log(newValue,oldValue)})
5.组合API-生命周期函数
6.组合式API-父子通信
父传子:
基本思想:
-
父组件中给子组件绑定属性
-
子组件内部通过props选项接收
const props=defineProps({属性名:类型})
<script setup>//父传子//1.给子组件,添加属性的方式传值//2.在子组件,通过props接收//局部组件(导入就能用)import SonCom from '@/components/son-com.vue'</script><div><SonCom></SonCom></div>
App.vue------------------------------------<script setup>//父传子//1.给子组件,添加属性的方式传值//2.在子组件,通过props接收//局部组件(导入就能用)import SonCom from '@/components/son-com.vue'import {ref} from 'vue'const money=ref(100)const getMoney=()=>{money.value+=10}</script><div><h3>父组件-{{money}}<button @click="getMoney"></button></h3><SonCom car="宝马车" :money=money></SonCom></div>--------------------------------------------------son-com.vue<script setup>const props=defineProps({car:String,money:Number})</script><template><div>//对于props传递过来的数据,模版中可以直接使用我是子组件-{{car}}-{{money}}</div></template>
子传父:
步骤:
-
父组件中给子组件标签通过@绑定事件
-
子组件内部通过emit方法触达事件
defineEmits(['事件名称'])触发emit('自定义事件名',参数)
App.vue------------------------------------<script setup>//父传子//1.给子组件,添加属性的方式传值//2.在子组件,通过props接收//局部组件(导入就能用)import SonCom from '@/components/son-com.vue'import {ref} from 'vue'const money=ref(100)const getMoney=()=>{money.value+=10}const changeFn=(newMoney)={money.value=newMoney}</script><div><h3>父组件-{{money}}<button @click="getMoney"></button></h3><SonCom @changeMoney="changeFn"car="宝马车" :money=money></SonCom></div>--------------------------------------------------son-com.vue<script setup>const props=defineProps({car:String,money:Number})const emit=defineEmits(['changeMoney'])consy buy=()=>{emit('changeMoney',5)}</script><template><div>//对于props传递过来的数据,模版中可以直接使用我是子组件-{{car}}-{{money}}<button @click="buy">花钱</button></div></template>
7.组合式API-模版引用
-
通过ref标识获取真实的dom对象或者组件实例对象
默认情况下在<script setup>语法糖下组件内部的属性和方法是不开放给父组件访问的
可以通过defineExpose编译宏指定哪些属性和方法允许访问
步骤:
-
调用ref函数生成一个ref对象
-
通过ref标识绑定对象到标签
<script setup>import {ref} from 'vue'const inp=ref(null)const clickfn=()=>{inp.value.fouse()}const textRef=ref(null)const getCom=()=>{console.log(textRef.value.count)textRef.value.sayHi()}</script><tempalte><div><input ref="inp" type="text"><button @click="clickfn">点开让输入框聚焦</button></div><TestCom ref="textRef"></TestCom><button @click="getCom">获取组件数据</button></tempalte>----------------------------------------<script srtup>const count=999const sayHi=()=>{console.log('打招呼')}defineExpose({count,sayHi})</script><tempalte><div>我只是用于测试的组件-{{count}}</div></tempalte>
8.组合式API-provide和inject
作用和场景
-
顶层组件向任意的底层组件传递数据和方法,实现跨层通信组件
跨层传递普通数据:
-
顶层组件通过provide函数提供数据
-
底层组件通过inject函数获取数据
顶层组件:
provide('key',顶层组件数据)
底层组件:
const message=inject('key')
---------------------------------------父组件:<csropt setup>//跨层传递普通数据provide('them-color','pink')//跨层传递响应式数据const count =ref(100)provide('count',count)setTimeout(()=>{count.value=500},2000)//跨层传递函数=>给子孙后代传递可以修改数据的方法provide('changeCount',(newCount)=>{count.value=newCount})</csropt><template><div><h1>我是父元素</h1></div></template>-------------------------------------------子元素:<script setup>import {inject} from 'vue'const themeColor=inject('theme-color')const count =inject('count')const changeCount=inject('changCount')const clickFn=()=>{changeCount(1000)}</script><template><div><h3>底层组件</h3></div></template>
9.Vue3.3新特性-defineOptions
-
所以在 Vue 3.3 中新引入了 defineOptions 宏。顾名思义,主要是用来定义 0ptions APl的选项。可以用defineOptions 定义任意的选项,props,emits,expose,slots 除外(因为这些可以使用 defineXXX 来做到)
<script setup> defineOptions({name:'Foo',inheritAttrs:false,//....更多自定义属性})</script>
10.Vue3.3新特性-defineModel
pinia
-
pania是vue的最新的 状态管理工具,是vuex的替代品
1.提供更加简单的API (去掉了 mutation)
2.提供符合,组合式风格的API(和 Vue3 新语法统一)
3.去掉了 modules 的概念,每一个 store 都是一个独立的模块
4.配合 TypeScript 更加友好,提供可靠的类型推断
1.手动添加Pinia到Vue项目
1.使用Vite创建一个空的Vue3项目
npm create vue@latest
2.按照官方文档安装pinia到项目中
1. npm install pinia
2.//创建一个pinia实例(根store)并将其传递给应用import {creatApp} from 'vue'import {creatPinia} from 'pinia'import {App} from './App.vue'const pinia=creatPinia()const app=creatApp(App)app.use(pinia)app.mount(#app)
2.pinia基本语法
3.action异步实现
-
安装axios
npm i axios
-
导入
import {defineStroe} from 'pinia'import {ref} from 'vue'import axios from 'axios'export const useChannelStore=definneStore('channel',()=>{//声明数据const channelList=ref([])//声明操作数据的方法const getList=async ()=>{//支持异步const {data:{data}}=await axios.get('')channel.List.value=data.channels}//声明getters相关return {channelList,getList}})
4.storeToStore
解构数据:
const {name,doubleCount}=storeToRefs(store)
结构方法:直接解构
const {increment}=store
5.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仓库中,persist:true开启
pnpm
element
引入element plus
pnpm add element-plus
看官网:Button 按钮 | Element Plus
pinia构建用户仓库和持久化
持久化:
pnpm add pinia-plugin-persistedstate -D
相关文章:
Vue2,Vue3知识大全
Vue 1.了解vue,快速上手 vue是一个用于构建用户的界面的渐进式框架. vue的两种使用方法: vue核心包开发 场景:局部模块改造 vue核心包&vue插件 工程化开发 场景:整站开发 1.创建一个vue实例: 2.插值表达式 1.插值表达式是一种Vue的模版语法 作用:利用表达式进行插值…...
java面向对象02:回顾方法
回顾方法及加深 定义方法 修饰符 返回类型 break:跳出switch和return的区别 方法名 参数列表 package com.oop.demo01;//Demo01类 public class Demo01 {//main方法public static void main(String[] args) {}/*修饰符 返回值类型 方法名(...){//方法体return…...
【Ubuntu】【树莓派】Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问和文件传输操作
目录 一、Ubuntu远程终端并实现文件上传下载 1.1Ubuntu桥接模式设置和新用户的创建 1.2Ubuntu的远程登录并上传和下载文件 1.3在Xming中进行Ubuntu的图形访问 二、树莓派远程登录并实现文件上传下载 2.1树莓派在putty上的远程登录 2.2使用ftp远程登录并实现文件上传下载…...
Linux Kernel 2
地址空间(Address Space) 一、物理地址空间(Physical Address Space) 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例:在典型的 32 32 32 位 Intel 架构中, RAM(…...
二.springBoot项目集成ElasticSearch及使用
二.springBoot项目集成ElasticSearch及使用 1.依赖引入2.ElasticSearch常见用法 1.依赖引入 <!--elasticsearch搜索引擎--> <!--高版本7.0后TransportClient已被淘汰,用rest-high-level-client代替--> <dependency><groupId>org.elasticse…...
从三次方程到复平面:复数概念的奇妙演进(一)
注:本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第一篇。 生料,不同的文章不同的点。 机翻,未校。 Reflections on the History of Complex Numbers 复数的历史回顾 The first occurrence o…...
Day52 | 6. Z 字形变换、8. 字符串转换整数 (atoi)、22. 括号生成、38. 外观数列
6. Z 字形变换 题目链接:6. Z 字形变换 - 力扣(LeetCode) 题目难度:中等 代码: class Solution {public String convert(String s, int numRows) {if(numRows<2) return s;List<StringBuilder> rowsnew A…...
每日OJ_牛客_ruby和薯条_排序+二分/滑动窗口_C++_Java
目录 ruby和薯条_排序二分/滑动窗口 题目解析 C代码 Java代码 ruby和薯条_排序二分/滑动窗口 ruby和薯条 描述: ruby很喜欢吃薯条。 有一天,她拿出了n根薯条。第i根薯条的长度为ai。 ruby认为,若两根薯条的长度之差在l和r之间ÿ…...
快速幂运算
快速幂运算 一、快速幂运算快速幂运算(Exponentiation by Squaring)基本思想算法实现(②③为非递归)① 递归运算② 普通 除模运算(不带 **模数** 与 带 **模数**)③ 按位与运算 使用示例示例代码 复杂度分析…...
vue @import引入CSS scoped无效 造成全局样式污染
引入css文件导致全局样式污染 1.写在单组件的style里面css样式,如果标签内不加scoped可能会影响其他组件的样式 <style lang"scss" scoped> </style> 2.通过import引入的外部css文件,这种引入方式是全局的,也会影响其…...
基于Flask-Login简单登录和权限控制实践
1. 关于Flask-Login Flask-Login 是一个为python Flask Web框架设计的扩展,用于管理用户会话(用户登录状态)。它提供了简单的接口来处理用户登录、注销、记住用户等功能,同时确保用户会话的安全性。以下是 Flask-Login 的一些关键特性和功能: 1.1. 主要功能 用户会话管理…...
文件流---------获取文件的内容到控制台
总流程:先创建一个文本文件------->里面写入一些内容(纯字母和字母加文字)-----------> 然后通过输入流获取文件里面的内容,两种方式。 1.第一种,获取单个的字符 ,先创建文件 ,java.txt…...
idea 2024 build菜单不见了
Q如题 idea 2024 新版UI添加build和recompile菜单 A如图,右键顶部栏之后,点击Add to Main Toolbar菜单,在里面就能找到Build菜单,添加接口。 Recompile菜单的话在Customize Toolbar中搜索添加才行。...
深入理解计算机操作系统(持续更新中...)
文章目录 一、计算机系统漫游1.1信息就是位上下文 一、计算机系统漫游 1.1信息就是位上下文 源程序实际上就是一个由值0和1组成的位(又称为比特),八个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符 大部分现代计…...
[dp8_子数组] 乘积为正数的最长子数组长度 | 等差数列划分 | 最长湍流子数组
目录 1.乘积为正数的最长子数组长度 2.等差数列划分 3.最长湍流子数组 写代码做到,只用维护好自己的一小步 1.乘积为正数的最长子数组长度 链接:1567. 乘积为正数的最长子数组长度 给你一个整数数组 nums ,请你求出乘积为正数的最长子数…...
量子机器学习(Quantum Machine Learning, QML)在优化测试组合
量子机器学习(Quantum Machine Learning, QML)在优化测试组合选择中展现出显著潜力,通过量子计算的并行性和量子态叠加特性,可高效解决传统方法难以处理的组合爆炸问题。以下是其技术实现路径、优势及落地案例: 一、QML优化测试组合的核心原理 1. 量子并行性加速搜索 经典…...
Go语言Slice切片底层
Go语言(Golang)中切片(slice)的相关知识、包括切片与数组的关系、底层结构、扩容机制、以及切片在函数传递、截取、增删元素、拷贝等操作中的特性。并给出了相关代码示例和一道面试题。关键要点包括: 数组特性…...
导入 Excel 批量替换文件夹名称
文件夹重命名的需求是多种多样的,前面我们介绍过按照规则修改文件夹名称的方法。但是在某些场景下,这个方法可能是不适用的,比如我们修改文件夹的规则是多种多样的,是无规律的。那我们应该怎么做呢?今天我们就给大家介…...
数据库或表数据迁移(使用Navicat迁移MySQL数据库表数据)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 数据库或表数据迁移(使用Navicat…...
Matlab Add Legend To Graph-图例添加到图
Add Legeng To Graph: Matlab的legend()函数-图例添加到图 将图例添加到图 ,图例是标记绘制在图上的数据序列的有用方法。 下列示例说明如何创建图例并进行一些常见修改,例如更改位置、设置字体大小以及添加标题。您还可以创建具有多列的图…...
【Linux】what is pam?PAM模块学习笔记
文章目录 1. pam模块简介2. pam验证的工作流程3. pam模块配置文件3.1 配置文件的格式3.1.1 验证类别type3.1.2 验证的控制标识 control flag3.1.3 pam模块 4. login的PAM验证机制流程5. 补充:其他pam相关文件6. 参考内容 1. pam模块简介 PAM: Pluggable Authentica…...
5.1 GitHub订阅监控系统实战:FastAPI+SQLAlchemy高效架构设计与核心源码揭秘
GitHub Sentinel Agent 分析报告功能设计与实现 关键词:订阅管理 API 设计、GitHub API 集成、SQLAlchemy ORM、JWT 认证、单元测试框架 1. 订阅管理功能架构设计 订阅管理模块采用分层架构设计,通过 FastAPI 构建 RESTful 接口,结合 SQLAlchemy ORM 实现数据持久化: #me…...
【BEPU V1物理】BEPUphysics v1 入门指南 汉化笔记#1
BEPUphysics v1 入门指南 前言下载获取库工程1.创建物理模拟环境2.添加物理实体3.与物理系统交互4.发射物体5.构建环境6.事件处理7. 进阶学习 前言 本文档记录完成 BEPUphysics 物理引擎的基础设置。 文档链接:https://github.com/bepu/bepuphysics1/blob/master/Documentatio…...
方法加事务在多线程中注意事项
方法加事务在多线程中注意事项 redission分布式锁释放异常问题 https://www.jianshu.com/p/055ae798547a https://blog.csdn.net/cheng__yu/article/details/122625649 虽然文章 https://blog.csdn.net/cheng__yu/article/details/122625649 和 redission锁是没关系的&#…...
开源 2D 横版跳跃游戏 SuperTux
官网 https://www.supertux.org/ 正文 在游戏的世界里,开源游戏以其独特的魅力吸引着众多玩家和开发者。今天要介绍的 SuperTux,便是一款备受瞩目的开源 2D 横版跳跃游戏,风格类似经典的超级马里奥系列。 2024 年,SuperTux 开发团…...
基于HASM模型的高精度建模matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 本课题主要使用HASM进行高精度建模,主要对HASM模型进行介绍以及在实际中如何进行简化实现的。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行…...
C++多线程编程时的伪共享问题及其定位和解决
一、引言 在多线程编程和共享内存系统中,为了提高程序性能,常常需要对共享数据进行处理。然而,在并发环境下,一种名为“伪共享(False Sharing)”的问题可能会悄然出现,它虽然不像传统的多线程同…...
高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案
高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案 一、概述 在当今互联网应用中,短信服务是极为重要的一环。面对每天发送2000万条短信的需求,我们需要一个能够处理海量数据(一年下来达到数千万亿级别&…...
【HTML】html文件
HTML文件全解析:搭建网页的基石 在互联网的广袤世界里,每一个绚丽多彩、功能各异的网页背后,都离不开HTML文件的默默支撑。HTML,即超文本标记语言(HyperText Markup Language),作为网页创建的基…...
5.11 GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南
GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南 关键词:GitHub API 调试、JSON 解析异常、提示工程优化、异步任务阻塞、数据清洗策略 5.5 测试与调试:调试常见问题 问题1:GitHub API 调用异常 现象: requests.exceptions.HTTPError: 403 Client Error…...
协程的原生挂起与恢复机制
目录 🔍 一、从开发者视角看协程挂起与恢复 🧠 二、协程挂起和恢复的机制原理:核心关键词 ✅ suspend 函数 ≠ 普通函数 ✅ Continuation(协程的控制器) 🔧 三、编译器做了什么?࿰…...
机器学习中的数学(PartⅡ)——线性代数:2.2矩阵
概述 本节内容也相对简单,首先介绍了矩阵的定义,矩阵的表示方法;然后介绍了矩阵的加法和乘法,与标量的乘法,以及一些矩阵相关算数运算的性质,包括满足结合律、交换律;矩阵的逆和转置࿱…...
泉涌未来:科技与生态的共生诗篇-济南
故事背景 故事发生在中国山东济南的未来城市环境,这里不再是单纯的自然景观与现代建筑的堆砌,而是科技与生态深度融合的奇妙世界。泉水,这一济南的灵魂元素,在未来科技的赋能下,成为连接城市各个角落的纽带。量子态泉水…...
用AI生成系统架构图
DeepSeek+Drawio+SVG绘制架构图-找到一种真正可行实用的方法和思路 1、使用DeepSeek生成SVG文件,导入drawio工具的方法 🔥 问题根源分析 错误现象: • 导入时报错包含 data:image/SVG;base64 和 %20 等 URL 编码字符 • 代码被错误转换为 Base64 格式(适用于网页嵌入,但…...
网络基础1
目录 初识协议 协议分层 软件分层的好处 OSI七层模型 TCP/IP 五层(或四层)模型 再谈协议 为什么要有 TCP/IP 协议? TCP/IP 协议与操作系统的关系 所以究竟什么是协议? 网络传输基本流程 认识 MAC 地址 局域网(以太网为例)通信原理 报文的传…...
免费且好用的PDF水印添加工具
软件介绍 今天要给大家推荐一款超实用的PDF添加水印工具,它能够满足用户给PDF文件添加水印的需求,而且完全免费。 这款PDF添加水印的软件有着简洁的界面,操作简便,无需安装,解压后即可使用。 在使用前,先…...
C++Primer对象移动
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
互联网三高-数据库高并发之分库分表ShardingJDBC
1 ShardingJDBC介绍 1.1 常见概念术语 ① 数据节点Node:数据分片的最小单元,由数据源名称和数据表组成 如:ds0.product_order_0 ② 真实表:再分片的数据库中真实存在的物理表 如:product_order_0 ③ 逻辑表:…...
七、自动化概念篇
自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的过程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人…...
python操作mongodb
1、安装包 pyMongo是MongoDB官方推荐的Python驱动程序,它提供了访问MongoDB数据库所需的接口。安装PyMongo非常简单,可以通过pip包管理工具来安装最新版本: pip install pymongo 安装完成后,我们可以使用以下Python代码来检查是否…...
IS-IS中特殊字段——OL过载
文章目录 OL 过载位 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年04月13日20点12分 OL 过载位 路由过载 使用 IS-IS 的过载标记来标识过载状态 对设备设置过载标记后ÿ…...
行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)
行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第一部分)-CSDN博客 Propagation of Interplanetary Shocks in the Heliosphere [ Chapter 3 ] [PDF: arXiv] 本文保留原文及参考文献,参…...
紫光同创FPGA实现HSSTLP光口视频点对点传输,基于Aurora 8b/10b编解码架构,提供6套PDS工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的 GT 高速接口解决方案Xilinx系列FPGA实现GTP光口视频传输方案推荐Xilinx系列FPGA实现GTX光口视频传输方案推荐Xilinx系列FPGA实…...
正则表达式使用知识(日常翻阅)
正则表达式使用 一、字符匹配 1. 普通字符 描述:直接匹配字符本身。示例: abc 匹配字符串中的 “abc”。Hello 匹配字符串中的 “Hello”。 2. 特殊字符 .(点号): 描述:匹配任意单个字符(…...
CSS padding(填充)学习笔记
CSS 中的 padding(填充)是一个非常重要的属性,它用于定义元素边框与元素内容之间的空间,即上下左右的内边距。合理使用 padding 可以让页面布局更加美观、清晰。以下是对 CSS padding 的详细学习笔记。 一、padding 的作用 padd…...
Python中的字符串、列表、字典和集合详解
Python是一门强大的编程语言,其内置的数据结构丰富多样。其中,字符串、列表、字典和集合是最常用的数据类型。本文将对它们的区别、用法和使用场景进行详细介绍,帮助大家更好地理解和应用这些数据结构。 1. 字符串(String…...
【CUDA编程】CUDA Warp 与 Warp-Python 对比文档
相关文档: Nvidia-Warp GitHub:nvidia/warp CUDA Warp 和 Warp-Python 库 的对比与统一文档,涵盖两者的核心概念、区别、使用场景及示例: 1. CUDA Warp(硬件/编程模型概念) 1.1 定义与核心概念 定义: C…...
中厂算法岗面试总结
时间:2025.4.10 地点:上市的电子有限公司 面试流程: 1.由负责人讲解公司文化 2,由技术人员讲解公司的技术岗位,还有成果 3.带领参观各个工作位置,还有场所 4.中午吃饭 5.面试题,闭卷考试…...
Losson 4 NFS(network file system(网络文件系统))
网络文件系统:在互联网中共享服务器中文件资源。 使用nfs服务需要安装:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服务的程序 rpcbind :管理nfs所有进程端口号的程序 nfs的部署 1.客户端和服务端都安装nfs-utils和rpcbind #安装nfs的软件rpcbind和…...
自动化运行后BeautifulReport内容为空
一、问题描述 自动化程序运行后发现运行目录下生成的html报告文件内容为空,没有运行结果。 二、测试环境 操作系统:Windows 11 家庭版BeautifulReport:0.1.3Python:3.11.9Appium-Python-Client:5.0.0Appium Server:2.…...