首页 > 其他分享 >前端学习-vue视频学习013-pinia

前端学习-vue视频学习013-pinia

时间:2024-03-24 23:44:31浏览次数:32  
标签:vue talkList title state 013 let pinia import

尚硅谷视频教程

了解pinia

集中式状态(数据)管理的工具,主要管理各组件之间的共享数据

准备一个效果

学到的几个点

  • html下拉选择框,可以使用v-model双向绑定
  • v-modle获取的值为字符串,可以写为v-model.number,会尽量转为数字
<select name="num" v-model.number="n">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
</select>
  • 随机获取id的方式有uuid和nanoid,需要npm i nanoid,import引入后使用
<script setup name="LoveTalk" lang="ts">
    import { reactive } from 'vue';
    import axios from 'axios';
    import { nanoid } from 'nanoid'

    let talkList = reactive([
        {id:'talk01',title:'asdfghjkl'},
        {id:'talk02',title:'awejdfaaff'},
        {id:'talk03',title:'irjeqirh'},
        {id:'talk04',title:'ljfdkjfdf'},
    ])
    async function getTalk() {
        // 连续解构赋值+重命名
        let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?fomat=json')
        let obj = {id:nanoid(),title}
        talkList.unshift(obj)
    }
</script>

搭建pinia环境

  • 安装pinia
npm i pinia
  • 引入、创建、安装pinia
// 引入createApp创建应用
import { createApp } from "vue";
//  引入APP根组件
import App from './App.vue'

// 引入pinia
import { createPinia } from "pinia";
// 引入路由器
// import router from "./router";
// 创建一个应用
const app = createApp(App)
// 创建pinia
const pinia = createPinia()
// 使用路由器
// app.use(router)

// 安装pinia-要在应用挂载前 否则报错
app.use(pinia)
// 挂载应用到app容器
app.mount('#app')

读取、存储、修改数据

读取+存储

  • 在src中新建文件夹store,专门用于存放pinia数据
  • 新建ts文档,将要用到的数据存放在里面
import { defineStore } from "pinia";

export const useCountStore = defineStore('count',{
    // state是真正存储数据的地方
    state(){
        return {
            sum:6
        }
    }
})
  • 读取/使用存放着pinia的数据
<template>
    <div class="count">
        <h2>求和:{{ countPinia.sum }}</h2>
    </div>
</template>
<script setup name="Count" lang="ts">
    import { ref } from 'vue';
    import { useCountStore } from '@/store/count'

    let countPinia = useCountStore()
</script>

修改数据的三种方式

方式1:直接操作数据
function add() {
    // 方式1
    CountStore.sum += n.value
    // sum.value += n.value
}
方式2:批量修改数据
function add() {
    // 方式1
    // CountStore.sum += n.value
    // 方式2
    CountStore.$patch({
        sum:888,
        title:'aaa'
    })
    // sum.value += n.value
}
方式3:使用actions,在其中放置方法,对应响应组件中的动作
  • 使用actios
    store/talk.ts
import { defineStore } from "pinia";
import axios from "axios";
import { nanoid } from 'nanoid'

export const useTalkStore = defineStore('talk',{
    actions:{
        async addList() {
            // 连续解构赋值+重命名
            let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?fomat=json')
            let obj = {id:nanoid(),title}
            // talkStore.talkList.unshift(obj)
            this.talkList.unshift(obj)
        }
    },
    // state是真正存储数据的地方
    state(){
        return {
            talkList:[
                {id:'talk01',title:'asdfghjkl'},
            ]
        }
    }
})
  • 使用actions定义的方法
    Talk.vue

<script setup name="LoveTalk" lang="ts">
    import { useTalkStore } from '@/store/talk'

    let talkStore = useTalkStore()
    // let talkList = reactive([
    //     {id:'talk01',title:'asdfghjkl'},
    // ])
    function getTalk() {
        talkStore.addList()
    }
</script>

storeToRefs

在解构数据时,会遇到失去响应式的情况
通常使用toRefs解决
但在pinia中,如果直接使用toRefs 会出现所有数据、方法都获取到的情况
因此pinia提供storeToRefs,只会取到数据

<template>
    <div class="count">
        <h2>求和:{{ sum }}</h2>
    </div>
</template>

<script setup name="Count" lang="ts">
    import { useCountStore } from '@/store/count'
    import { storeToRefs } from 'pinia'

    let countStore = useCountStore()
    let { sum } = storeToRefs(countStore)
</script>

getters

export const useCountStore = defineStore('count',{
    actions:{
        increment(value) {
            this.sum += value
        },
        minus(value) {
            this.sum -= value
        }
    },
    // state是真正存储数据的地方
    state(){
        return {
            sum:6
        }
    },
    getters:{
        // 写法1
        // bigSum(state) {
        //     return state.sum*10
        // }
        // 写法2
        // bigSum():number {
        //     return this.sum*10
        // }
        // 写法3
        bigSum:state => state.sum*10
    }
})

$subscribe 监视修改

使用浏览器本地存储作为例子
Talk.vue

<script setup name="LoveTalk" lang="ts">
    import { reactive } from 'vue';
    import axios from 'axios';
    import { nanoid } from 'nanoid'
    import { useTalkStore } from '@/store/talk'

    let talkStore = useTalkStore()

    talkStore.$subscribe((mutate,state)=>{
        // localStorage.setItem('talkList',state.talkList)
        localStorage.setItem('talkList',JSON.stringify(state.talkList))
    })
    function getTalk() {
        talkStore.addList()
    }
</script>

talk.ts

import { defineStore } from "pinia";
import axios from "axios";
import { nanoid } from 'nanoid'

export const useTalkStore = defineStore('talk',{
    actions:{
        async addList() {
            // 连续解构赋值+重命名
            let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?fomat=json')
            let obj = {id:nanoid(),title}
            // talkStore.talkList.unshift(obj)
            this.talkList.unshift(obj)
        }
    },
    // state是真正存储数据的地方
    state(){
        return {
            talkList:JSON.parse(localStorage.getItem('talkList')) || []
        }
    }
})

store的组合式写法

import { defineStore } from "pinia";
import axios from "axios";
import { nanoid } from 'nanoid'

// export const useTalkStore = defineStore('talk',{
//     actions:{
//         async addList() {
//             // 连续解构赋值+重命名
//             let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?fomat=json')
//             let obj = {id:nanoid(),title}
//             // talkStore.talkList.unshift(obj)
//             this.talkList.unshift(obj)
//         }
//     },
//     // state是真正存储数据的地方
//     state(){
//         return {
//             talkList:JSON.parse(localStorage.getItem('talkList')) || []
//         }
//     }
// })
import { reactive } from "vue";
export const useTalkStore = defineStore('talk',()=>{
    let talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || [])
    async function addList() {
        // 连续解构赋值+重命名
        let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?fomat=json')
        let obj = {id:nanoid(),title}
        // talkStore.talkList.unshift(obj)
        talkList.unshift(obj)
    }
    return {talkList,addList}
})

标签:vue,talkList,title,state,013,let,pinia,import
From: https://www.cnblogs.com/ayubene/p/18092559

相关文章

  • 基于Spring Boot+Vue的高校学科竞赛平台
    末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发更多项目:CSDN主页YAML墨韵学如逆水行舟,不进则退。学习如赶路,不能慢一步。目录一、项目简介二、开发技术与环境配置2.1SpringBoot框架2.2Java语言简介2.3Vue的介绍2.4mysql数据库介绍2.5B/S......
  • 基于Spring Boot+Vue的高校办公室行政事务管理系统
    末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发更多项目:CSDN主页YAML墨韵学如逆水行舟,不进则退。学习如赶路,不能慢一步。目录一、项目简介二、开发技术与环境配置2.1SpringBoot框架2.2Java语言简介2.3Vue的介绍2.4mysql数据库介绍2.5B/S......
  • 【JavaWeb】Day19.Vue组件库Element——常见组件
    一.Element常见组件-表格Table表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。首先打开官网找到表格(Element-Theworld'smostpopularVueUIframework)以带边框表格为例,点击显示代码把代码复制到自己的vue项目中点击npm脚本运行,......
  • 【JavaWeb】Day18.Vue组件库Element
    什么是ElementElement:是饿了么团队研发的,一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。组件:组成网页的部件,例如超链接、按钮、图片、表格、表单、分页条等等。官网:Element-Theworld'smostpopularVueUIframeworkElement快速入门安装ElementUI......
  • 【javaWeb &第三篇】Vue快速入门
    VUEvue是一套前端框架,免除原生的js的DOM操作,简化书写基于MVVM(model-view-viewmodel)思想,实现数据的双向绑定,将编程的关注放在数据上。什么是框架:框架相当于一个半成品,是一套高效的代码模板,基于框架开发更加的高效VUE数据绑定模型:model层中存在着对数据的处理,vi......
  • 基于 HttpRunner + Django + Vue + Element UI 的接口自动化测试平台,生产可用
    LunarLink平台简介基于HttpRunner+Django+Vue+ElementUI的接口自动化测试平台,生产可用。此外,非常感谢花菜。没有AnotherFasterRunner就不会有LunarLink......
  • vue2 defineComponent 自定义组件的强大功能
    完全可以通过向defineComponent()传入一个选项式API所定义的object,来定义一个组件,并包含各种响应式功能;如下About组件所示:<scriptsetup>import{ref,computed,defineComponent}from'vue'constHome=defineComponent({template:`<h1>Home</h1>`})constAbo......
  • vue-cli3中拉取vue-cli2
    vue-cli3中拉取vue-cli2拉取2.x模板(旧版本)VueCLI>=3和旧版使用了相同的 vue 命令,所以VueCLI2(vue-cli)被覆盖了。如果你仍然需要使用旧版本的 vueinit 功能,你可以全局安装一个桥接工具:npminstall-g@vue/cli-init#`vueinit`的运行效果将会跟`vue-......
  • 源码!大学生兼职跟踪系统ssm+vue+mysql
    大学生兼职跟踪系统java+ssm+vue+mysql摘要演示视频系统开发流程系统结构设计系统主要功能介绍管理员功能模块个人中心商家管理学生管理兼职招聘管理兼职应聘管理论坛管理学生前后台功能模块兼职招聘兼职论坛开发环境后端:前端:数据库:!!!有需要的小伙伴可以点击下方链接直......
  • 源码!病人跟踪治疗信息管理系统(ssm+vue)
    病人跟踪治疗信息管理系统java+ssm+vue摘要演示视频系统功能结构病人跟踪治疗信息管理系统的结构图所示:登录结构图:系统主要功能介绍系统功能分析病例采集管理医生管理行动轨迹管理核酸检测报告管理预约管理开发环境后端:前端:数据库:!!!有需要的小伙伴可以点击下方链接直接......