Vue入门——Piana使用

Vue入门——Piana使用Piana 使用 vuepiana

大家好,欢迎来到IT知识分享网。

Piana:Vue专属最新状态管理库(Vuex状态管理工具的替代)

  • 提供更简单的API(去掉mutation)
  • 提供与vue3语法一致的组合式风格API
  • 去掉modules概念,每一个store都是独立模块
  • 搭配TypeScript 一起使用提供可靠类型判断

安装Piana

可以查看Piana官方文档进行操作
用自己喜欢的包管理器执行安装命令就好了,个人喜好npm

npm install pinia 

安装成功后,需要吧Piana添加到项目中如下代码所示:

//1、导入creatPiana import { 
    createPinia } from 'pinia' //2、执行方法得到实例 const piana = createPinia() //3、把Piana实例加入到app应用中 createApp(App).use(piana).mount('#app') 

初步使用Piana完成计数器自增

store:一个放数据的仓库(可以算公共组件)我们需要使用defineStore方法来创建,这个store会存放全局使用的数据如下代码所示

import { 
    defineStore } from "pinia"; import { 
    ref } from "vue"; export const useCounterStore = defineStore( 'counter' , () => { 
    //定义数据 const count = ref(0) //定义修改数据的方法(action 同步+异步) const increment = () => { 
    count.value ++ } //以对象形式return供数组使用 return { 
    count, increment } } ) 

需要在src目录下创建stores文件夹用来存放创建的各种store
主页面把这个store引入后当对象调用就好了,如下代码所示:

<script setup> import { 
      useCounterStore } from './stores/counter'; const counterStore = useCounterStore() console.log(counterStore) </script> <template> <div> <button @click="counterStore.increment">{ 
  {counterStore.count}}</button> </div> </template> 

getters实现

使用computed函数模拟

import { 
    defineStore } from "pinia"; import { 
    computed, ref } from "vue"; export const useCounterStore = defineStore( 'counter' , () => { 
    //定义数据 const count = ref(0) //定义修改数据的方法(action 同步+异步) const increment = () => { 
    count.value ++ } //getter定义 const doubleCount = computed(() => count.value * 2) //以对象形式return供数组使用 return { 
    count, increment, doubleCount } } ) 

异步action

Piana去掉mutation只使用action来实现同步和异步

<script setup> import { 
      useCounterStore } from './stores/counter'; import { 
      onMounted } from 'vue'; const counterStore = useCounterStore() console.log(counterStore) onMounted(() => { 
      counterStore.getList() }) </script> <template> <div> <button @click="counterStore.increment">{ 
  {counterStore.count}}</button> <div>{ 
  {counterStore.doubleCount}}</div> <ul> <li v-for="item in counterStore.list" :key="item.id"> { 
  {item.name}} </li> </ul> </div> </template> 
import { 
    defineStore } from "pinia"; import { 
    computed, ref } from "vue"; import axios from "axios"; export const useCounterStore = defineStore( 'counter' , () => { 
    //定义数据 const count = ref(0) //定义修改数据的方法(action 同步+异步) const increment = () => { 
    count.value ++ } const API_URL = "https://geek.itheima.net/V1_0/channels" //getter定义 const doubleCount = computed(() => count.value * 2) //action 实现异步 const list = ref([]) const getList = async () => { 
    const res = await axios.get(API_URL) list.value = res.data.data.channels } //以对象形式return供数组使用 return { 
    count, increment, doubleCount, list, getList } } ) 

直接对store解构赋值会导致响应式丢失(数据类型),解决这个问题我们需要使用storeToRefs方法对需要解构的store(数据)进行包裹,方法直接解构即可

//直接解构会导致响应式丢失 //const {count , doubleCount} = useCounterStore //使用storeToRefs对需要解构的store响应式不会丢失 const { 
   count , doubleCount} = storeToRefs(useCounterStore) //在对方法进行结构时,直接解构即可,storeToRefs只用来包裹数据 const{ 
    increment } = useCounterStore 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/145826.html

(0)
上一篇 2025-04-18 21:33
下一篇 2025-04-18 21:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信