Vue_day2

目录

1.简述 mitt 

2. pinia 模块化和与 vuex 中的store的区别

2.1pinia模块化

2.2与Vuex中的store的区别

3. request.js

4.Vue中的管理状态store


1.简述 mitt 

介绍

mitt是一个小型的js库,提供了一个事件总线的功能。

作用

可以在组件之间通信,尤其是父组件和子组件间传递数据。创建事件总线对象来触发和监听事件。

步骤

1.安装mitt库

npm install mitt 

2.引入库并创建事件总线对象

import mitt from 'mitt'
const bus = mitt ()

3.在发送方组件中触发事件

bus.emit ('eventName', data)

4.在接收方组件中监听事件

bus.on ('eventName', (data)=>{
//处理数据
})

5.API

// 创建mitt实例
mitt()
// 事件名称到注册处理程序函数的映射。
all
//触发事件,两个参数:name:触发的方法名,data:需要传递的参数
emit(name,data) 
// 绑定事件,两个参数:name:绑定的方法名,callback:触发后执行的回调函数
on(name,callback) 
// 解绑事件,一个参数:name:需要解绑的方法名
off(name) 

2. pinia 模块化和与 vuex 中的store的区别

2.1pinia模块化

1.是什么?

指将应用程序的状态拆分为多个独立的模块,用来管理局部或全部的状态,每个模块都可以包含自己的状态、操作和 getters 等内容,从而实现更加灵活和可维护的状态管理。

2.有什么用?

拆分为多个独立的模块,让每个模块只关注自己内部的状态和操作,可以提高代码的可读性和可维护性,避免状态过于庞大和混乱。

3.怎么用?

1)安装 Pinia

npm install pinia

2)创建状态模块

通过 defineStore 方法创建一个 store 实例,并为该实例指定所需的状态、操作和 getters 等内容。

import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      this.count++
    },
    decrement() {
      this.count--
    }
  },
  getters: {
    doubleCount() {
      return this.count * 2
    }
  }
})

3)创建 store 实例时,可选择将其导出为一个模块,在其他文件和组件中可以引入并使用

  使用 useStore 函数在组件中获取 store 实例,并用它进行状态管理。

2.2与Vuex中的store的区别

1.基础架构不同

Pinia 是基于 Vue 3 的新特性 Composition API 构建的,而 store 是基于 Vue 2 的 Object.defineProperty 构造函数实现的。

2.模块化支持不同

Vuex 中,使用 modules 可以将大型应用程序的状态逻辑分解为更小的模块。而 Pinia 则通过创建多个 stores 实例来实现类似的功能。

3.使用方式不同

store 中,我们需要在每个组件中注入 store 对象,并通过该对象获取和操作状态数据。而在 Pinia 中,我们可以通过 useStore() 钩子函数直接在组件中获取和操作状态数据。

4.TypeScript 支持不同

Pinia 将 TypeScript 的支持作为其设计目标之一,并提供了许多类型和装饰器来帮助开发人员更好地使用它。而 store 的 TypeScript 支持较为有限。

总之,虽然 Piniastore 都用于管理全局状态,但它们的实现方式、使用方式和功能特点都有所不同,开发者可以根据实际需求选择适合自己的状态管理库。如果你正在使用 Vue 3,并希望使用 Composition API 来管理状态,那么 Pinia 会是一个不错的选择。

3. request.js

1.是什么?

是一个js库,用来发起HTTP请求,并提供了一些功能。如:请求拦截、响应拦截、请求重试、超时处理等。

2.怎么用?

1)安装 request.js:

npm install request --save

2)在项目中引入 request.js:

import Request from 'request'

3)创建一个 Request 实例并配置选项:

const request=new Request({ 
baseURL:'https://example.com/api',
timeout:10000,
})

4)发起HTTP请求:

使用 request.get 方法来发送GET请求,并通过 params 参数传递查询参数

request.get('/users',{params:{page:1}}).then((response) => {
console.log(response.data)
})

5)处理响应数据:

通过 then 方法来处理请求成功的响应数据,并通过 catch 方法来处理请求失败的错误信息。

request.get('/users',{params:{page:1}}).then((response) => {
console.log(response.data)
}).catch((error) => {
console.error(error)
})

3.优点

能够便捷灵活地发起HTTP请求,且支持拦截器、重试、超时等,提高开发效率和代码质量。

4.Vue中的管理状态store

1.介绍

在 Vue 中,可以通过 Vuex 插件来管理全局的状态,其中包括了 store全局状态容器。可以在 store 中定义全局的状态数据并提供一些方法对其进行操作,然后在任意组件中调用这些方法来实现对状态数据的操作。

2.步骤

首先导入Vue 和 Vuex,并通过 Vue.use(Vuex) 安装 Vuex 插件。然后,创建一个名为 store 的 Vuex 实例,并定义statemutationactiongetter 等对象来管理应用的状态逻辑。

3.使用

在 Vue 组件中使用 Vuex 时,我们可以通过 $store.state 访问 state 变量,通过$store.commit() 方法提交 mutation,通过 $store.dispatch() 方法提交 action,通过 $store.getter 访问 getter。

4.作用

将所有状态数据集中到一个全局的 store 对象中,能够方便地统一管理整个应用程序的状态数据,同时也可以避免不同组件之间相互引用带来的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue可以通过使用第三方组件库或自己编写组件来实现日历签到功能。 1. 使用第三方组件库 例如,使用Element UI中的DatePicker组件,可以实现选择日期的功能。在选中日期后,可以将签到状态保存到后端数据库中,再在日历上展示已签到的日期。 2. 自己编写组件 可以使用Vue自带的组件和插件来编写日历签到组件。具体实现方法如下: - 在Vue项目中创建一个Calendar组件; - 使用Vue自带的v-for指令展示日历; - 在每个日期上绑定点击事件,用来切换签到状态; - 将签到状态保存到Vuex或后端数据库中; - 在日历上展示已签到的日期。 下面是一个简单的日历签到组件代码示例: ```html <template> <div class="calendar"> <div class="header">{{ year }}年{{ month }}月</div> <table> <thead> <tr> <th v-for="day in days">{{ day }}</th> </tr> </thead> <tbody> <tr v-for="week in weeks"> <td v-for="date in week" :class="{ active: isSigned(date) }" @click="toggleSign(date)">{{ date }}</td> </tr> </tbody> </table> </div> </template> <script> export default { data() { return { year: new Date().getFullYear(), month: new Date().getMonth() + 1, days: ["日", "一", "二", "三", "四", "五", "六"], weeks: [], signedDates: [] }; }, computed: { daysInMonth() { const date = new Date(this.year, this.month, 0); return date.getDate(); } }, mounted() { this.generateCalendar(); }, methods: { generateCalendar() { const firstDay = new Date(this.year, this.month - 1, 1).getDay(); const lastDate = this.daysInMonth; const weeks = []; let week = []; for (let i = 0; i < firstDay; i++) { week.push(""); } for (let i = 1; i <= lastDate; i++) { week.push(i); if (week.length === 7) { weeks.push(week); week = []; } } if (week.length > 0) { for (let i = week.length; i < 7; i++) { week.push(""); } weeks.push(week); } this.weeks = weeks; }, toggleSign(date) { if (this.isSigned(date)) { // 取消签到 const index = this.signedDates.indexOf(date); this.signedDates.splice(index, 1); } else { // 签到 this.signedDates.push(date); } // 将签到状态保存到Vuex或后端数据库中 }, isSigned(date) { return this.signedDates.includes(date); } } }; </script> <style> .calendar { width: 300px; margin: 0 auto; text-align: center; } .header { font-size: 16px; font-weight: bold; margin-bottom: 10px; } table { width: 100%; border-collapse: collapse; } th { height: 30px; line-height: 30px; } td { height: 50px; line-height: 50px; cursor: pointer; } td.active { background-color: #66ccff; color: #fff; } </style> ``` 这个示例中的Calendar组件展示了一个月的日历,并提供了签到功能。你可以根据自己的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮的梨涡36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值