首页 > 其他分享 >pinia学习

pinia学习

时间:2024-08-12 11:28:51浏览次数:10  
标签:flager console color flag 学习 state pinia store

import { ref, computed } from 'vue';
import { defineStore } from 'pinia';
import { useRoute } from 'vue-router';
/**
 * 一、和vuex区别:
 * 1.不需要有mutations,在组件直接通过counter.count修改、通过$patch()修改或者在actions里修改,仍然可以被vue-devtools捕获到。
 * 2.没有模块的概念,我们可以创建无穷多个store;而 vuex只能创建一个store其他都是模块。
 *
 * 二、
 * 1.选项式api使用简单;组合式api使用复杂还要返回store但是更灵活功能强大。  可以视情况一个store使用选项一个store使用组合。
 * 2.我的感觉是,每个store都像一个组件一样,有自己的data、computed、methods;
 * 3.选项式api:可以直接调用$reset()方法;组合式需要自己创建;
 */

/**
 *  ref() 会被转化为 state 属性
 *  computed()  会被转化为 getters
 *  function关键字定义的函数  会被转化为 actions
 */
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0);
  const doubleCount = computed(() => count.value * 2);
  function increment() {
    const route = useRoute();
    console.log('%c [ route1 ]-18', 'font-size:13px; background:pink; color:#bf2c9f;', route);
    count.value++;
  }

  return { count, doubleCount, increment };
});

export const useFlagerStore = defineStore('flager', {
  // state() {
  //   return {
  //     flag: 0,
  //   };
  // },
  // 为了完整类型推理,推荐使用箭头函数
  state: () => ({
    flag: 0,
    items: [{ name: 'clothes', quantity: 1 }],
  }),
  // getters: {
  //   doubleFlag(): number {
  //     return this.flag * 2;
  //   },
  // },
  //1.使用箭头函数可以自动进行类型推理,如果是上面的字面量增强的function,那么必须要返回一个数据类型。
  //2.箭头函数默认会传参state,如果想用this去访问$store实例,那就必须用完整function了。
  getters: {
    doubleFlag: state => state.flag * 2,
  },
  actions: {
    increment() {
      const route = useRoute();
      console.log('%c [ route2222 ]-18', 'font-size:13px; background:pink; color:#bf2c9f;', route);
      this.flag++;
    },
    async testFunc() {
      return Promise.resolve();
      // return Promise.reject();
    },
  },
});

 

<template>
  <header>
    <div>--------state里的基本数据类型--------</div>
    <div>{{ counter.count }}</div>

    <div>{{ flager.flag }}</div>
    <div>--------state里的引用数据类型--------</div>

    <div>{{ flager.items }}</div>
    <div>---------getters-------</div>
    <div>{{ flager.doubleFlag }}</div>

    <div><button @click="handleClick">修改</button></div>
    <div><button @click="handleReset">重置</button></div>
    <div><button @click="handleAction">测试侦听action</button></div>

    <div class="wrapper">
      <HelloWorld msg="You did it!" />

      <nav>
        <RouterLink to="/">Home</RouterLink>
        <RouterLink to="/about">About</RouterLink>
      </nav>
    </div>
  </header>

  <RouterView />
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
import { RouterLink, RouterView } from 'vue-router';
import HelloWorld from './components/HelloWorld.vue';
import { useCounterStore, useFlagerStore } from './stores/index';
const counter = useCounterStore();
const flager = useFlagerStore();

function handleClick() {
  // counter.count++;
  counter.increment();
  // counter.$patch({ count: counter.count + 10 });

  // 修改仓库里state的4种方式;
  flager.flag++;
  flager.increment();
  flager.$patch({ flag: flager.flag + 10 });
  flager.$patch(state => {
    state.flag++;
    state.items.push({ name: 'shoes', quantity: 100 });
  });
}

function handleReset() {
  flager.$reset();
}

//侦听的两种方式:
//方式一:用pinia的侦听器
flager.$subscribe((mutation, state) => {
  mutation.type; // 有三种类型,'direct' | 'patch object' | 'patch function';分别对应直接修改、$patch传递一个对象、$patch传递一个函数;
  mutation.storeId; // 和 flagerStore.$id 一样,表示仓库的唯一id
  mutation.payload; //只有 mutation.type === 'patch object'的情况下, mutation.payload才可用,并且值是传递给 flagerStore.$patch() 的补丁对象。

  console.log('变更后的state', state);
});

//方式二:用vuex3的侦听器
watch(
  () => flager.flag,
  async (newValue, oldValue) => {
    console.log('%c [ oldValue ]-63', 'font-size:13px; background:pink; color:#bf2c9f;', oldValue);
    console.log('%c [ newValue ]-63', 'font-size:13px; background:pink; color:#bf2c9f;', newValue);
  },
);
watch(flager.$state, async (newValue, oldValue) => {
  console.log('%c [ oldValue ]-63', 'font-size:13px; background:pink; color:#bf2c9f;', oldValue);
  console.log('%c [ newValue ]-63', 'font-size:13px; background:pink; color:#bf2c9f;', newValue);
});

function handleAction() {
  flager.testFunc();
}
// action的侦听器
const unsubscribe = flager.$onAction(
  ({
    name, // action 名称
    store, // store 实例,类似 `someStore`
    args, // 传递给 action 的参数数组
    after, // 在 action 返回或解决后的钩子
    one rror, // action 抛出或拒绝的钩子
  }) => {
    // 为这个特定的 action 调用提供一个共享变量
    const startTime = Date.now();
    // 这将在执行 "store "的 action 之前触发。
    console.log(`Start "${name}" with params [${args.join(', ')}].`);

    console.log('%c [ store ]-82', 'font-size:13px; background:pink; color:#bf2c9f;', store, store === flager);

    // 这将在 action 成功并完全运行后触发。
    // 它等待着任何返回的 promise
    after(result => {
      console.log(`Finished "${name}" after ${Date.now() - startTime}ms.\nResult: ${result}.`);
    });

    // 如果 action 抛出或返回一个拒绝的 promise,这将触发
    one rror(error => {
      console.warn(`Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`);
    });
  },
);

// 手动删除监听器
// unsubscribe();
</script>

<style scoped>
header {
  line-height: 1.5;
  max-height: 100vh;
}

.logo {
  display: block;
  margin: 0 auto 2rem;
}

nav {
  width: 100%;
  font-size: 12px;
  text-align: center;
  margin-top: 2rem;
}

nav a.router-link-exact-active {
  color: var(--color-text);
}

nav a.router-link-exact-active:hover {
  background-color: transparent;
}

nav a {
  display: inline-block;
  padding: 0 1rem;
  border-left: 1px solid var(--color-border);
}

nav a:first-of-type {
  border: 0;
}

@media (min-width: 1024px) {
  header {
    display: flex;
    place-items: center;
    padding-right: calc(var(--section-gap) / 2);
  }

  .logo {
    margin: 0 2rem 0 0;
  }

  header .wrapper {
    display: flex;
    place-items: flex-start;
    flex-wrap: wrap;
  }

  nav {
    text-align: left;
    margin-left: -1rem;
    font-size: 1rem;

    padding: 1rem 0;
    margin-top: 1rem;
  }
}
</style>
./stores

 

标签:flager,console,color,flag,学习,state,pinia,store
From: https://www.cnblogs.com/EricShen/p/18354621

相关文章

  • 深度学习流体力学【干货】
     深度学习作为一种新兴的机器学习技术,为流体科学的研究提供了新的思路和方法。通过对大量数据的学习和分析,深度学习模型可以自动提取特征和模式,为流体科学中的复杂问题提供解决方案。然而,深度学习在流体科学中的应用还面临一些挑战,需要进一步研究和探索。未来,深度学习与传统流......
  • 【人工智能】【机器学习】- 好书推荐之《深度学习调参指南》
    《深度学习调参指南》是一份由Google和哈佛大学的研究人员与工程师共同编写的实战手册,旨在帮助读者系统性地优化深度学习模型的性能。该指南强调了在深度学习实践中遇到的实际问题和解决方案,尤其关注超参数调优的过程,同时也涉及工作流实施和优化等其他方面。目标读者对最大化......
  • 通过JUnit源码分析学习编程的奇技淫巧
    打开Maven仓库,左边选项栏排在第一的就是测试框架与工具,今天的文章,V哥要来聊一聊程序员必备的测试框架JUnit的源码实现,整理的学习笔记,分享给大家。有人说,不就一个测试框架嘛,有必要去了解它的源码吗?确实,在平时的工作中,我们只要掌握如何使用JUnit框架来帮我们测试代码即可,搞什......
  • 后端开发学习敏捷需求-->干系人分析与识别
    干系人分析与识别5W1H干系人分析与识别1.干系人是什么直接或者间接影响专题,以及被专题影响的人和组织,用户也是属于干系人,是产品直接或者间接的使用者又叫利益相关者,指积极参与专题或者在专题中其利益可能受积极或消极影响的个人或组织2.为什么要分析和识别干系人......
  • Elasticsearch 学习总结 - 相关配置补充说明
    Elasticsearch的基本概念term索引词,在elasticsearch中索引词(term)是一个能够被索引的精确值。foo,FooFoo几个单词是不相同的索引词。索引词(term)是可以通过term查询进行准确的搜索。text文本是一段普通的非结构化文字,通常,文本会被分析称一个个的索引词,存储在elasticsearch的索......
  • 【学习笔记4】论文MAC-SQL: A Multi-Agent Collaborative Framework for Text-to-SQL
    Abstract        最近基于大型语言模型(LLM)的Text-to-SQL方法在处理“庞大”数据库和需要多步推理的复杂用户问题时,通常会遭遇显著的性能下降。此外,大多数现有方法忽视了LLM利用外部工具和模型协作的重要性。为了解决这些挑战,我们提出了MAC-SQL,这是一种新颖的基于......
  • Java学习笔记1--JDK,JRE和JVM
    1、Java开发环境Java开发环境是指Java程序员开发、编写、测试和调试Java程序所使用的所有工具和技术。Java开发环境通常由以下几个部分组成:JDK(JavaDevelopmentKit):JDK是Java开发环境的核心组件,它包括了Java编译器、JRE(Java运行环境)、JavaDoc文档生成器和其他一些工具。JDK是J......
  • Java学习笔记2--JDK的安装和配置
    一.进入oracle官网,下载jdkoracle官网:Oracle|CloudApplicationsandCloudPlatformps:不同的浏览器,可能进入oracle官网,会只显示部分内容,所以建议使用googleChrome浏览器在下载之前,首先需要去查看本机电脑的配置型号,如下图,右键---此电脑---选择点击属性,显示x64版本如下......
  • 【python学习】巧用notedown:Markdown与Jupyter Notebook的高效互转指南
    在数据科学、教学、技术写作等领域,Markdown文件和JupyterNotebook都是非常重要的工具。notedown是一个轻量级的Python库,能够方便地将Markdown文件转换为JupyterNotebook,或将JupyterNotebook转换为Markdown文件。这篇博客将介绍notedown的基本用法、常见命......
  • 【AIGC】StableDiffusion学习笔记
    本文目的:简单介绍ComfyUI下StableDiffusion的基本使用方法,及对各基本节点、技术的理解,让未接触过SD的同学能够快速入门。注:本文中所有tooltips为【可下载导入工作流】的图片均可通过插件进行工作流导入,方便检索下载对应的自定义节点。 一、什么是StableDiffusion?StableDiffu......