当前位置: 首页 > wzjs >正文

哈尔滨网站设计快速建站广州网站快速排名

哈尔滨网站设计快速建站,广州网站快速排名,怎么手动安装网站程序,网页制作培训班前景#本文基于Vue3和ts去实现Pinia的使用与安装,Pinia用法为组合式API,情景教学为一个基于全局的举报框的pinia逻辑# 1,下载pinia 这里推荐pnpm下载 pnpm add pinia 2,在main.ts中注册并挂载pinia // main.ts import { createApp }…

#本文基于Vue3和ts去实现Pinia的使用与安装,Pinia用法为组合式API,情景教学为一个基于全局的举报框的pinia逻辑#

1,下载pinia

这里推荐pnpm下载

pnpm add pinia

2,在main.ts中注册并挂载pinia

// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia' // 导入 Pinia
import App from './App.vue'const app = createApp(App)// 创建 Pinia 实例
const pinia = createPinia()// 挂载 Pinia
app.use(pinia)app.mount('#app')

 3,创造一个Store

  1. 引入defineStore方法
  2. 使用 defineStore 定义 store,推荐store的命名方式为use+模块+Store
  3. 其他语法与vue3一致
  4. 最后别忘了return导出
export const useCounterStore = defineStore('counter', () => {const count = ref(0)const doubleCount = computed(() => count.value * 2)const increment = () => {count.value++}return { count, doubleCount, increment }
})

4, 在组件中使用store

  1. 引入对应单例
  2. 引入storeToRefs保持响应式解构
  3. 剩下的像ref变量一样直接使用即可
<!-- Component.vue -->
<script setup lang="ts">
import { useCounterStore } from '@/stores/counter'
import { storeToRefs } from 'pinia' // 保持响应式解构const counterStore = useCounterStore()// 直接解构会失去响应式,需要用 storeToRefs
const { count, doubleCount } = storeToRefs(counterStore)
const { increment } = counterStore
</script><template><div><p>Count: {{ count }}</p><p>Double: {{ doubleCount }}</p><button @click="increment">+1</button><button @click="counterStore.reset()">Reset</button></div>
</template>

5,项目的目录结构建议

  1.  可以在src下单独开一个stores用来存放所有的仓库
  2.  可以创造index.ts来统一导出所有的store
// stores/index.ts示例
export * from './counter'
export * from './user'

情景教学 

        #你需要实现一个举报框,能在不同页面弹出,如评论区的举报,视频页的举报,帖子的举报。如果在每个帖子中引用,会导致剧烈的堆积。如果在大页面引用,被举报者的id等数据的传递又即为麻烦。是时候用pinia了#

1,创建reportStore.ts

// 举报框所用数据
import {defineStore} from 'pinia'
import {ref} from 'vue'export const useReportStore = defineStore('report', () => {})

2, 创建举报所需的所有状态

  1. 举报框的显示的bool变量
  2. 举报方相关信息
  3. 举报的描述文本
  4. 举报原因(源自多选框)
    // 控制举报对话框的显示状态const isReportDialogVisible = ref<boolean>(false)// 存储被举报被人的相关信息const reportTarget = ref<{id: string | number,type: 'post' | 'commment' | 'user' | string;title?: string;} | null>(null)// 举报描述文本const reportDescription = ref<string>('')// 举报原因const reportReasons = ref<string[]>([])

3,封装打开对话函数

  1. 这一步成功实现跨组件传递数据
  2. 携带举报ID等所有信息
     // 打开举报对话框const openReportDialog = (target:{id: string | number;type: 'post' | 'comment' | 'user' | string;title?: string}) => {reportTarget.value = targetisReportDialogVisible.value = truereportDescription.value = '' // 清空之前的举报描述reportReasons.value = []  // 清空举报原因}

4,封装关闭函数与提交举报函数

需注意:提交函数返回一个数组对象,提供给父组件组做消息提醒,让父组件做最后的结果逻辑处理

    // 关闭举报对话框const closeReportDialog = () => {isReportDialogVisible.value = false}// 提交举报const submitReport = async (): Promise<{ success: boolean; message: string }> => {if (!reportReasons.value.length) {return {success: false,message: '请至少选择一个举报原因'}}if (!reportDescription.value.trim()) {return {success: false,message: '请填写举报描述'}}try {// 调用实际的APIconsole.log('举报信息:', {targetId: reportTarget.value?.id,targetType: reportTarget.value?.type,description: reportDescription.value,type: reportReasons.value})// 举报成功后关闭对话框并清除信息closeReportDialog()return {success: true,message: '举报已提交'}} catch(error) {return {success: false,message: '举报提交失败,请稍后再试'}}}

5,全部返回

    return {submitReport,closeReportDialog,openReportDialog,reportDescription,reportTarget,isReportDialogVisible,reportReasons}

 父组件中

1,引入reportStore,创造调用并解构

  • 引入storeToRefs
  • 解构得到举报物名字,类型,举报原因,显示控制,彻底实现数据传递
  • 推荐把方法也解构出来,我这里没实现
  • 解构后按照正常变量使用就行(记得script中还是要用.value)
import { useReportStore } from '@/stores/reportStore'
import { storeToRefs } from 'pinia'
const reportStore = useReportStore()
const { isReportDialogVisible, reportDescription, reportTarget, reportReasons } = storeToRefs(reportStore)
const getTargetName = computed(() => reportTarget.value.title || `ID ${reportTarget.value.id}` || '未知内容' )

2,提交函数的实现

  • 因为store中已实现了提交函数,关闭函数的逻辑,父组件的提交函数仅需实现善后工作,对用户的操作进行反馈
  • 拿取store中提交函数返回的消息进行反馈 
  • 作者这里使用ElMessage和ElLoading实现用户反馈,需要提前引入ElementUI组件库
const onSubmit = async () => {const { success, message } =  await reportStore.submitReport()if (success){const loading = ElLoading.service({lock: true,text: '正在提交举报中...',background: 'rgba(0,0,0,0.7)',})setTimeout(() => {loading.close()ElMessage({message: `收藏成功`,type: 'success',plain: true,showClose: true})ElMessage.success(message)}, 500)}else{ElMessage.warning(`${message}`)}
}

http://www.dtcms.com/wzjs/112099.html

相关文章:

  • 网站建设要素的核心内容二级域名注册
  • 一个网站两个数据库seo建站是什么
  • 网上购物平台排名前十名sem和seo有什么区别
  • 做汽车内饰皮革批发的网站互联网舆情
  • 易语言做网站简单教程十大网络推广公司排名
  • 顺德网站建设价格如何在百度上做广告
  • 网站个人备案步骤互联网平台公司有哪些
  • thinkphp5做网站产品seo是什么意思
  • 三只松鼠网站谁做的网络推广公司加盟
  • 渭南有几个县seo sem是指什么意思
  • 怎么做安居客网站seo优化推广公司
  • 企业没有做网站有的坏处站内优化主要从哪些方面进行
  • 北京手机网站建设seo舆情优化
  • 老龄委网站 建设目的病毒式营销方法
  • 网站建设美工招聘引流客户的最快方法是什么
  • 新的购物网站怎么做流量分析免费com网站域名注册
  • 电子商务网站建设维护有没有欺骗一个新公众号怎么吸粉
  • 南京做网站设计百度资讯指数
  • 开发高端网站开发站长收录
  • wordpress标签关联黑帽seo培训网
  • 文昌网站建设 myvodoseo到底是什么
  • 网站设计的流程是怎样的千锋教育学费多少
  • 黄冈人才网最新招聘徐州网页关键词优化
  • wordpress悬浮反馈个人博客seo
  • 网站 图标 素材东莞营销网站建设
  • be备案网站河南网站公司
  • 单页网站搭建做外贸怎么推广
  • 毕业设计餐饮网站建设市场营销咨询
  • 怎样自己做企业网站西安企业做网站
  • dede网站怎么设置首页网络广告投放