如何使用 Pinia ORM 管理 Vue 中的状态

news2024/9/20 20:25:39

6a0fef6db4dd67f1fc76e65c7a309f6d.jpeg

状态管理是构建任何Web应用程序的重要组成部分。虽然Vue提供了管理简单状态的技术,但随着应用程序复杂性的增加,处理状态可能变得更具挑战性。这就是为什么像Pinia这样的库被创建出来,以增强Vue的基本状态管理能力。然而,在大型应用程序中使用Pinia可能会带来挑战,这就是为什么建议使用ORM库来处理大型项目中状态管理的复杂性。

Pinia ORM包通过与Vue状态有效地配合工作,帮助防止单树状态(single-tree state)的缺点。本教程将探讨Pinia ORM的特性以及如何在您的Vue应用程序中使用它们。

在开始本教程之前,我假设你已经熟悉Vue.js和Pinia,并且在你的电脑上已经安装了Node.js。

Pinia ORM 概述

ORM(对象关系映射)是一种通过将Vue应用中的状态数据视为代码中的对象而不是手动处理来管理和组织数据的方法。它使您可以以模型的方式思考应用程序状态,将典型的数据库CRUD操作带入您的Vue应用程序中,使其更加熟悉。

Pinia ORM是Pinia状态管理库的抽象,它允许开发者将Pinia存储库视为数据库对象而不是普通状态。它允许开发者以一种能提高应用性能的方式来操作和查询数据。

在Vue项目中设置Pinia ORM

本节将介绍如何在新的Vue项目中配置Pinia ORM。打开终端,导航到您想要安装项目的目录,并运行以下命令。

npm init vue@latest

运行上述命令将提示您选择应用程序功能。我将为本教程设置应用程序功能,如下面的屏幕截图所示。选择应用程序功能后,请输入以下命令。

b2c5f5f9a45b4d4e6197bce083de471e.png

cd vue-app
npm install
npm run dev

现在你应该已经启动并运行了你的应用程序,如下所示:

1a639c0af7cdcc6aa5af4827524e399e.png

Pinia ORM 安装

您可以使用NPM包安装Pinia ORM。在终端中,导航到项目文件夹并输入以下命令以安装Pinia ORM。

npm install pinia pinia-orm --save

创建Pinia数据库模型

Pinia ORM模型代表应用程序的数据结构。模型用于定义数据库表和列,以及它们的初始值和数据类型。

https://pinia-orm.codedredd.de/guide/model/getting-started

让我们通过创建一个简单的数据库(friendship)来演示Pinia ORM模型的工作原理。该数据库将包含一个表(friends)和五个列(id、username、fullname、age和email)。

在您的项目根目录中,导航到 src 目录,创建一个 friendship.js 文件,并添加以下代码。

// friendship.js
// Friend Model

import { Model } from "pinia-orm";

export default class Friend extends Model {
  // entity is a required property for all models.
  static entity = "friends";

  static fields() {
    return {
      id: this.uid(),
      Username: this.string(""),
      Fullname: this.string(""),
      Age: this.string(""),
      Email: this.string(""),
    };
  }
}

从上面的代码中,实体是数据库表名 friends ,而表列被传递到fields方法中。

Pinia ORM数据库注册

现在我们已经成功创建了数据库的表格,在访问Pinia ORM功能之前,我们需要在组件中注册数据库。在 src 文件夹内,创建一个 Myfriends.vue 文件的新组件,并添加以下代码。

// src/components/Myfriends.vue
<script>
  import { useRepo } from "pinia-orm";
  import { createPinia } from "pinia";
  import { createORM } from "pinia-orm";
  import Friend from "../stores/friendship";
  const pinia = createPinia().use(createORM());
  const useRepo1 = useRepo(Friend, pinia);
</script>

在上面的代码中,我们导入了: useRepo , createPinia , createORM 和 Friend 。接下来,我们创建了一个Pinia ORM的实例,并使用useRepo方法注册了数据库,该方法接受两个参数: Friend 和 Pinia 。

插入数据到数据库中

Pinia ORM 使用 save() 方法将新记录添加到数据库表中。Pinia ORM 的 save() 语法如下:

useRepo(Friend, pinia).save({
   column1: “data 1”,
   column2: “data 2”,
   // ...
   columnN: “data n”,
});

以上代码将向表中插入一条新记录( Friend )。如果有任何表列被省略,将会将该列的初始值添加到数据库中。

在 Myfriends.vue 组件中,我们可以要求用户输入他们朋友的详细信息,并使用Pinia ORM的save()方法将数据保存到数据库中。为了实现这一点,请使用以下代码更新 Myfriends.vue 。

// src/components/Myfriends.vue
<script>
import { useRepo } from "pinia-orm";
import { createPinia } from "pinia";
import { createORM } from "pinia-orm";
import Friend from "../stores/friendship";
const pinia = createPinia().use(createORM());

const useRepo1 = useRepo(Friend, pinia);

export default {
  data() {
    return {
      form: {
        username: "",
        fullname: "",
        age: "",
        email: "",
      },
    };
  },

  methods: {
    addfriend() {
      useRepo1.save({
        Username: this.form.username,
        Fullname: this.form.fullname,
        Age: this.form.age,
        Email: this.form.email,
      });
      console.log(useRepo1.all());
    },
  },
};
</script>
<template>
  <div>
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
      rel="stylesheet"
    />
    <center>
      <div
        style="
          width: 100%;
          height: 60px;
          margin-bottom: 20px;
          margin-top: 100px;
        "
      >
        <div>
          <label for="">Username</label>
          <input v-model="form.username" />
          <label for="">Fullname</label>
          <input v-model="form.fullname" /> <br />
          <br />
          <label for="">Age</label>
          <input v-model="form.age" />
          <label for="">Email</label>
          <input v-model="form.email" />
          <br /><br />
          <button @click="addfriend" class="btn-link">Add Friend</button>
        </div>
        <br /><br /><br />
      </div>
    </center>
  </div>
</template>

在您的浏览器中刷新应用程序;您应该看到以下输出:

e27ae192aafc69325352f6b508614ed1.png

从数据库获取数据

Pinia ORM 使用 all() 方法从数据库中检索数据,该方法将获取数据库中的所有数据。可以按照以下方式使用 all() 方法:

const useRepo1 = useRepo(Friend, pinia).all()

上面的代码将按升序从数据库中获取所有记录。然而,我们可以使用Pinia ORM模块中的useCollect来对数据进行排序并执行一些操作,如下所示。

import { useCollect } from 'pinia-orm/dist/helpers' //.. const useRepo1 =
useRepo(Friend, pinia).all() // sort the record by 'Username' attributes
useCollect(useRepo1).orderBy('Username') // get the min of the 'age' attribute
useCollect(useRepo1).min('age') // get the max of the 'age' attribute
useCollect(useRepo1).max('age') // get the sum of the 'age' attribute
useCollect(useRepo1).sum('age') // sort by 'age' attribute
useCollect(useRepo1).sortBy('age') // get all values in 'age' attribute
useCollect(useRepo1).pluck('age') // get all primary keys
useCollect(useRepo1).keys()

在 Myfriends.vue 组件中,让我们使用 all() 方法从数据库中获取所有记录,并在我们的应用界面中显示更新。将以下代码添加到 Myfriends.vue 脚本中:

// src/components/Myfriends.vue
// . . .
export default {
  computed: {
    friend_list: () => useRepo1.all(),
  },
  // . . .

接下来,我们可以通过将以下代码添加到 Myfriends.vue 模板中来显示记录。

<!-- . . . -->
<div class="container">
  <h2>My Friend List</h2>
  <table class="table table-striped">
    <thead>
      <tr>
        <th>Username</th>
        <th>Fullname</th>
        <th>Age</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="friend in friend_list">
        <td>{{ friend.Username }}</td>
        <td>{{ friend.Fullname }}</td>
        <td>{{ friend.Age }}</td>
        <td>{{ friend.Email }}</td>
      </tr>
    </tbody>
  </table>
</div>

在浏览器中刷新应用程序,并获得以下输出。

4f4526d4d763f25124f3afb1f10d2ae4.png

从数据库中删除数据

Pina ORM提供了两种从数据库中删除记录的方法。第一种方法使用delete()查询,用于删除具有指定条件的记录。delete()查询的使用方法如下。

const useRepo1 = useRepo(Friend, pinia)
useRepo1.where('Username', 'John').delete()

上述代码将删除表中用户名为 John 的记录。

第二种方法使用destroy()查询从数据库中删除记录;它接受记录的ID作为参数。destroy()查询可以按以下方式使用。

const useRepo1 = useRepo(Friend, pinia)
useRepo1.destroy(1) // delete record id 1
useRepo1.destroy([1,4,5]) // delete record id 2,4,5

Pinia ORM表关系

Pinia ORM提供了一种独特的方法来处理数据库中表之间的连接,使得可以在数据库模型类中定义各种关系类型,包括一对一、一对多和多对多。

一对一关系

Pinia ORM的一对一关系是一种关系,其中表中的每个记录与另一个表中的一个记录相关联。当存在唯一约束或需要将特定数据隔离到单独的表中时,通常使用这种类型的关系。例如,一个 Users 表可能与一个“Profile”表具有一对一的关系,其中每个用户都有一个唯一的个人资料。让我们创建两个表(Users和Profile)来演示一对一关系的工作原理。在 store 文件夹中,创建一个User.js文件并添加以下代码。

// User Model
import { Model } from "pinia-orm";
import Profile from "./Profile";
export default class User extends Model {
  // entity is a required property for all models.
  static entity = "users";
  static fields() {
    return {
      id: this.uid(2),
      name: this.attr(""),
      email: this.string(""),
      profile: this.hasOne(Profile, "userID"),
    };
  }
}

在上面的代码中,通过将Profile类作为第一个参数和“userID”作为“hasOne”方法的外键来定义一对一关系,创建User和Profile表之间的唯一关联,将Profile表中的“userID”字段与User表中的“id”字段链接起来。接下来,让我们创建Profile表。在 stores 文件夹中,创建一个Profile.js文件并添加以下代码。

// Profile Model  
import { Model } from "pinia-orm";
export default class Profile extends Model {
    // entity is a required property for all models.
    static entity = "profiles";
    static fields() {
        return {
            id: this.uid(),
            userID: this.attr(""),
            bio: this.attr(""),
            job: this.string(""),
        };
    }
}

一旦您在组件中注册了这两个数据库,您可以使用以下代码访问一对一关系记录。

const userinfo = User.query().with('profile').first()

一对多

在ORM关系中,一对多关系是指一个表中的单个记录与另一个表中的多个记录相关联。这种类型的关系通常用于建模父子关系,其中一个父对象可以有多个子对象。

在我们之前的例子中,假设一个用户可以拥有多个个人资料。我们可以使用一对多的关系,通过将 this.hasOne 替换为 this.hasMany 来将用户与个人资料记录关联起来,如下所示。

static fields() {
  return {
    id: this.uid(2),
    name: this.attr(""),
    email: this.string(""),
    profile: this.hasMany(Profile, "userID"),
    };
}

结束

Pinia ORM是Vue应用程序中管理状态的重要工具。它提供了一种灵活的方式来处理状态,允许开发人员使用数据库模型和关系模式来处理数据。

由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1132781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app中tab选项卡的实现效果 @click=“clickTab(‘sell‘)“事件可传参数

一、效果图 二、代码 <template><view><view class"choose-tab"><view class"choose-tab-item" :class"chooseTab 0 ? active : " data-choose"0" click"clickTab">选项1</view><view …

第三天:配置+运行代码+改个保存键

1.上午 11点前 1.拉取文件 刷新依赖库看代码改需求 2.上午11点后 解决问题如下2.1 2.2 看文档看代码 3.下午2点到6点 对接前端 看演示视频看代码把软件运行起来 4.一直报错 &#xff08;依赖环境装备配比&#xff09; 5.依赖文件一直报错&#xff08;一会好 一会错&…

项目团队管理的常见难点,如何有效解决?

在项目管理中&#xff0c;项目经理经常会遇到团队成员工作不积极、工作任务互相推诿、踢皮球以及习惯性甩锅等一系列的团队管理相关的问题&#xff1b;遭遇这几大常见问题后&#xff0c;项目推进就容易陷入僵局。在这种情况下&#xff0c;如何有效解决问题&#xff0c;提升工作…

Pytorch整体工作流程代码详解(新手入门)

一、前言 本文详细介绍Pytorch的基本工作流程及代码&#xff0c;以及如何在GPU上训练模型&#xff08;如下图所示&#xff09;包括数据准备、模型搭建、模型训练、评估及模型的保存和载入。 适用读者&#xff1a;有一定的Python和机器学习基础的深度学习/Pytorch初学者。 本文…

HDR和泛光

HDR 显示器被限制为只能显示值为0.0到1.0间的颜色&#xff0c;但是在光照方程中却没有这个限制。通过使片段的颜色超过1.0&#xff0c;我们有了一个更大的颜色范围&#xff0c;这也被称作HDR(High Dynamic Range, 高动态范围) 允许用更大范围的颜色值渲染从而获取大范围的黑暗…

APP盾的防御机制及应用场景

移动应用&#xff08;APP&#xff09;在我们日常生活中扮演着越来越重要的角色&#xff0c;但随之而来的是各种网络安全威胁的增加。为了保障APP的安全性&#xff0c;APP盾作为一种专门设计用于防御移动应用威胁的工具得以广泛应用。本文将深入探讨APP盾的防御机制以及在不同应…

计算机算法分析与设计(20)---回溯法(0-1背包问题)

文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品&#xff0c;第 i i i 个物品的重量为 W i W_i Wi​&#xff0c;价值为 V i V_i Vi​&#xff0c;对于一个最多能装重量 c c c 的背包&#xff0c;应该如何选择放入包中的物品…

命令行输入sns.countplot(data[‘marital‘])报错

代码sns.countplot(data[marital])是用于绘制柱状图来显示分类变量的频数分布。但是&#xff0c;根据警告信息&#xff0c;从Seaborn 0.12版本开始&#xff0c;只有一个有效的位置参数data&#xff0c;其他参数必须作为关键字参数传递。因此&#xff0c;你需要将参数data[marit…

【idea】使用教程:idea 打开项目、配置、项目打包详细教程

目录 一、配套软件安装 二、打开已有项目 三、配置 jdk 四、项目打包 五、服务器首次创建目录 &#xff08;1&#xff09;后端代码目录 &#xff08;2&#xff09;前端代码目录 &#xff08;3&#xff09; 打包后的代码包上传到服务器上 一、配套软件安装 【idea】wi…

current file is not included in a workspace moduleg 存在多个 main函数的 Go项目 无法成功导包

报错缘由 学习 hystria, 尝试自测案例,使用了 go get “github.com/afex/hystrix-go/hystrix” 进行导入包&#xff0c; 导入成功后&#xff0c;在代码里利用 import 导入&#xff0c;但遇到了以下报错 could not import github.com/afex/hystrix-go/hystrix (current file i…

WorkPlus打造安全专属的移动数字化航空母舰,助力企业全面掌控业务和生态

在快速发展的商业环境中&#xff0c;企业对于安全和全面掌控业务和生态的需求日益增长。WorkPlus作为一款安全专属的移动数字化航空母舰&#xff0c;为企业提供了独特的解决方案&#xff0c;助力企业全面掌控业务和生态&#xff0c;实现安全性和效率的最佳平衡。 WorkPlus提供…

游戏数据分析对于运营游戏平台的重要性

游戏数据分析对于运营游戏平台具有至关重要的意义&#xff0c;它可以提供深入的见解&#xff0c;帮助了解玩家行为、偏好和互动&#xff0c;从而优化游戏体验&#xff0c;提高玩家参与度和留存率。 首先&#xff0c;通过游戏数据分析&#xff0c;运营者可以了解玩家在游戏中的表…

山西电力市场日前价格预测【2023-10-26】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-26&#xff09;山西电力市场全天平均日前电价为343.86元/MWh。其中&#xff0c;最高日前电价为515.42元/MWh&#xff0c;预计出现在18: 15。最低日前电价为131.00元/MWh&#xff0c;预计…

centos7安装minio

MINIO官网地址&#xff1a;MinIO | 高性能分布式存储&#xff0c;私有云存储 可以在官网下在包 1.安装软件最好设置在 /usr/local路径下 cd /usr/local mkdir minio 2.在新创建的minio路径下执行 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio 默…

废柴勇士(据说没有人能坚持37秒)

欢迎来到程序小院 废柴勇士 玩法&#xff1a;点击屏幕下方左右按键击杀怪物&#xff0c;怪物会在左右方向同时来袭&#xff0c;快速点击按钮进行击杀怪物&#xff0c;看您能够坚持多少秒&#xff0c; 据说还没有能够坚持37秒&#xff0c;快去击杀怪物挑战吧^^。开始游戏https:…

宏集案例 | Panarama SCADA平台在风电场测量的应用,实现风电场的高效管理!

文章来源&#xff1a;宏集工业物联网 阅读原文&#xff1a;https://mp.weixin.qq.com/s/MLYhBWiWx7qQSApx_3xhmA 宏集Panorama SCADA平台在风电场测量的应用 宏集方案 01应用背景 随着煤碳、石油等能源的逐渐枯竭&#xff0c;人类越来越重视可再生能源的利用。风能作为一种…

【电路笔记】-平均电压和均方根电压(RMS Voltage)

平均电压和均方根电压&#xff08;RMS Voltage&#xff09; 文章目录 平均电压和均方根电压&#xff08;RMS Voltage&#xff09;1、概述2、平均电压3、均方根电压&#xff08;RMS Voltage&#xff09;4、总结 1、概述 在 DC 状态下&#xff0c;只能对电压值进行一种定义&…

javascript原生态xhr上传多个图片,可预览和修改上传图片为固定尺寸比例,防恶意代码,加后端php处理图片

//前端上传文件 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml" lang"UTF-8"></html> <html><head><meta http-equiv"Content-Type" content"text/html;charsetUTF-8;"/><title…

微信小程序通过获取键盘高度解决键盘弹出挡住输入框问题

我在这里写了个输入名称的头 在电脑上看着这输入效果还是挺优秀的 但当真的运行在手机上时 就会发现 这键盘一弹出来 就挡住我们的输入框了 这里 我们可以这样实现 在data中定义一个数值类型 叫 focusHeight 然后 给我们弹层 加上一个固定定位 然后 通过 focusHeight来控制…

【MySQL】用户与权限管理

文章目录 一、用户管理1、用户信息表2、创建用户3、删除用户4、修改用户密码 二、权限管理1、MySQL 权限2、给用户授权3、回收用户权限 一、用户管理 之前为了方便&#xff0c;我们学习 MySQL 时统一使用的都是 root 账号进行登录&#xff0c;但在实际的开发场景中必然是需要进…