vue3 学习入门

vue3 学习入门

前提:vue3中,操作数据需要对象.value,template中直接用值,

js 复制代码
```import {reaction } from " vue"
    const state=reaction({
    count=100
})

```js
  1. reaction函数:负责将接收的对象数据类型转化返回响应式对象
js 复制代码
```import {ref } from " vue"
const state=ref({
count=100
})

```js

2.ref函数:负责将简单数据类型或对象数据类型转化返回响应式对象 在脚本中访问数据需要加.value,在template模板中不需要加 本质:在传入的数据之上,外层又包了一层对象

3.watch 监听一个或多个数据的变化:

js 复制代码
监听单个数据变化:watch(count对象,(newvalue,oldvalue)=>{
    },{
    immediate:true ----一进页面就监听
    },
    {
    deep:true------深度监视
    })
js 复制代码
监听多个数据变化:watch([count对象1,count对象1],(newarr,oldarr)=>{
    })
js 复制代码
监听某个特定的数据变化:watch(()=>对象.属性,(newvalue,oldvalue)=>{
    })

4.父子通信 父传子 父组件中先导入子组件,在中写传入子组件的数据, 子组件由于加了setup,所以用defineprops宏,

go 复制代码
```js
const props=defineProps({
属性名:类型
})
```

子传父

js 复制代码
子组件:
const emit=defineEmits(['事件名1'])
const buy=()=>{
emit('事件名1',数据)
}


父组件:
    定义父事件名1:
    const 父事件名1=()=>{
    对象.value=newvalue
    }
    父组件的子组件中:@事件名1='父事件名1'

5.在script setup中,组件内部的属性和方法是不开放给父组件访问的,可以通过defineExpress编译宏指定哪些属性和方法允许访问(暴露组件内的属性方法)

js 复制代码
defineExpress({
属性名,
方法名
})

provide顶层组件向底层组件传递信息,inject底层组件接收来自顶层组件的信息

若是底层组件想改顶层组件传来的信息,顶层组件可以传递一个方法

js 复制代码
顶层组件:
provide('changeCount',(newCount)=>{
count.value=newcount
})
底层接收:
const changeCount=inject('changeCount')
const clickFn=()=>{
changeCount(1000)
}

vue3.3及以上新特性,加入defineOptions宏,与setup平级,可以用defineOptions定义任意选项,props,emits,expose,slots除外,这些已经有了宏

js 复制代码
defineOptions({
name:'afa'})

vue3.3及以上新特性,加入defineModel宏,与setup平级,可以用defineOptions定义任意选项,props,emits,expose,slots除外,这些已经有了宏

极大方便数据的双向绑定

js 复制代码
子组件:
const modelValue=defineModel()
<div>
<input
type="text"
:value="modelValue"
@input="e=>modelValue=e.target.value"
>
</div>

父组件:
const txt=ref('123456')
<div>
<子组件名 v-model="txt"></子组件名>
{{ txt }}
</div>

pinia章节

使用vite创建空的vue3项目 npm create vue@latest

在store中定义pinia仓库

js 复制代码
import {defineStore} from 'pinia'
import { ref,computed } from 'vue'
export const useCountStore= defineStore('count',()=>{
    //声明数据state
    const count=ref(0)
    //操作数据方法action
    const addCount=()=>count.value++
    const subCount=()=>count.value--
    //声明基于数据派生的计算属性getters(computed)
    const double=computed(()=>count.value*2)

    return{
        count,
        addCount,
        subCount,
        double
    }
})

state getters actions

actions可同步可异步,下面介绍异步

js 复制代码
import {defineStore} from 'pinia'
import { ref } from 'vue'
import axios from 'axios'
export const useCountStore= defineStore('count',()=>{
    //声明数据state
    const channelList=ref([])
    //操作数据方法action
    const getList=async()=>{
        //返回数据解构
        const {data:{data}} =await axios.get("地址")
        channelList.value=data.返回数据的字段

    }
        return{
        channelList,
        getList
        
    }
})

特别的,若导入到app.vue根组价pinia仓库数据进行了解构,会丢失响应式,此时可以用storeToRefs(),但方法可以直接解构,方法不需要响应式

pinia 持久化

js 复制代码
npm i pinia-plugin-persistedstate

在main.js中进行导入:

import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const pinia = createPinia()
app.use(pinia.use(piniaPluginPersistedstate))

注意:组合式,使用在你需要持久化的store文件的第三个参数,加上
{
    persist: true,
  },
  如果想改名字:
  {
  persist:{
  key:'mingzi',//修改本地存储的唯一标识
  paths:['count']//选择你要存储的变量名
  }
  }
相关推荐
子洋6 分钟前
本地安装 QuickJS 与 入门示例
前端·javascript·后端
Mike_jia8 分钟前
Gogs:极简自建Git服务神器——从零构建企业级代码管理平台
前端
Ronin-Lotus9 分钟前
上位机知识篇---脚本文件
linux·前端·chrome·终端命令·脚本文件
前端小巷子19 分钟前
Vue computed 与 methods 的本质差异
前端·vue.js·面试
啃火龙果的兔子1 小时前
CSS 预处理器(Preprocessor)和后处理器(Postprocessor)
前端·css
懋学的前端攻城狮1 小时前
JavaScript作用域与闭包深度解析:从原理到实战
前端·javascript
晓得迷路了1 小时前
栗子前端技术周刊第 92 期 - TypeScript 5.9、pnpm 10.14、Vite 下载量超 Webpack...
前端·javascript·vite
我不吃饼干9 小时前
在 React 中实现倒计时功能会有什么坑
前端·react.js
小小小小宇9 小时前
前端PerformanceObserver
前端
王者鳜錸9 小时前
PYTHON从入门到实践-18Django从零开始构建Web应用
前端·python·sqlite