vue3土味情话pinia可以持久保存再次修改App样式

news2024/11/27 2:26:58

我是不是你最疼爱的人-失去爱的城市

<template>
  <div class="talk">
    <button @click="getLoveTalk">土味情话</button>
   <ul>
     <li v-for="talk in talkStore.talkList" :key="talk.id">{{ talk.title }}</li>
   </ul> 
  </div>
</template>

<script setup lang="ts" name="LoveTalk">
import { useTalkStore } from '@/stores/loveTalk'

const talkStore = useTalkStore()
// 持久保存talkList
talkStore.$subscribe((mutation, state) => {
    localStorage.setItem('talkList', JSON.stringify(state.talkList))
})
// 方法
async function getLoveTalk() {
    talkStore.getATalk()
}
</script>
<style scoped>
.talk {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    box-shadow: 1px 1px 10px  #4caf50;
    border-radius: 10px;
    font-size: 15px;
  }
button {
    /* margin-right: 10px;
    margin-left: 10px; */
    text-align: center;
    background-color: #4caf50;
    color: white;
    padding: 10px;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    position: absolute;
    top: 80px;
    left: 35px;
  }
</style>

脚本

import { defineStore } from 'pinia'
import axios from 'axios'
import { nanoid } from 'nanoid'
// import { reactive } from 'vue'
export const useTalkStore = defineStore('talk', {
  actions: {
    async getATalk() {
      // 方法名可以随便起,但是要和定义的actions方法名一致
        const { data: { content: title } } = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
        //  把请求到的内容包装成字符串包装成对象,然后添加到talkList中
        const obj = { id: nanoid(), title }
        this.talkList.unshift(obj)
      }
    },
    state() {
      return {
        talkList:JSON.parse(localStorage.getItem('talkList') || '[]')
      }
    },

  /* 以下是修改组合式的代码 还 需要修改*/
//   const talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || []),
//   async function getATalk(){
//   // 方法名可以随便起,但是要和定义的actions方法名一致
//   let { data: { content: title } } = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
//         //  把请求到的内容包装成字符串包装成对象,然后添加到talkList中
//        let obj = { id: nanoid(), title }
//    talkList.unshift(obj)
//       }
// return { talkList, getATalk }
  })

 App样式:

<template>
  <MyBiaoZhi msg="与妖为邻" class="App-logo" />
  <div class="parent">
    <header>
      <nav>
        <ul class="App_ul">
          <li
            class="App_li"
            v-for="(menuItem, menuIndex) in menuItems"
            :key="menuIndex"
            @click="toggleSubMenu(menuIndex as number)"
            :class="{ active: activeMenuItem === menuIndex }"
          >
            <RouterLink replace :to="{ path: '/' }">{{ menuItem.label1 }}</RouterLink>
            <RouterLink replace :to="{ path: '/WangZhan' }">{{ menuItem.label2 }} </RouterLink>
            <RouterLink replace :to="{ path: '/XueXi' }">{{ menuItem.label3 }}</RouterLink>
            <RouterLink replace :to="{ name: 'About' }"> {{ menuItem.label4 }}</RouterLink>
          </li>
        </ul>
      </nav>
      <!-- <BeiJingShiJian /> -->
    </header>

    <div class="left_side"></div>
    <div class="right_side"></div>
    <div class="div4"><RouterView /></div>
  </div>
</template>
<script setup lang="ts" name="App">
// import BeiJingShiJian from './BeiJingShiJian.vue'
import MyBiaoZhi from './MyBiaoZhi.vue'
import { ref } from 'vue'
let menuItems = ref([
  { label1: '首页' },
  { label2: '网站' },
  { label3: '学习' },
  { label4: '关于' }
])
let activeMenuItem = ref() // 当前激活的菜单项索引
let activeSubMenu = ref()
function toggleSubMenu(menuIndex: any) {
  activeMenuItem.value = menuIndex // 设置当前激活的菜单项索引
  activeSubMenu.value = activeSubMenu.value === menuIndex ? null : menuIndex
}
</script>
<style scoped lang="scss">
.parent {
  /* https://cssgrid-generator.netlify.app/ */
  /* 网格布局 */
  display: grid;
  /* 列数: 34; */
  grid-template-columns: repeat(34, 1fr);
  /* 行数: 19; */
  grid-template-rows: repeat(19, 1fr);
  /* 列间距: 5px; */
  grid-column-gap: 5px;
  /* 行间距: 5px; */
  grid-row-gap: 2px;
}

header {
  grid-area: 1 / 1 / 3 / 35;
  height: 4rem;

  border: 1px solid rgba(0, 213, 255, 0.4);
}
ul {
  display: flex;
  top: 0rem;
  left: 20rem;
  text-align: center;
  position: relative;
  li {
    width: 80px;
    height: 53px;
    padding: 5px;
    perspective: 700px;
    cursor: pointer;
    margin-left: 1rem;
    transition: color 0.3s;
    border-radius: 10px;
    font-size: 2rem;
    background-image: linear-gradient(
      to top left,
      rgba(0, 0, 0, 0.2),
      rgba(0, 0, 0, 0.2) 30%,
      rgba(0, 0, 0, 0)
    );
    box-shadow:
      inset 4px 4px 4px rgba(255, 255, 255, 0.6),
      inset -4px -4px 5px rgba(0, 0, 0, 0.6);
    border: 0px solid black;
      // box-shadow:
      // 0 0 10px 2px rgba(0, 0, 0, 0.2),
      // 0 0 1px 2px black,
      // inset 0 2px 2px -2px white,
      // inset 0 0 2px 8px #4c4343,
      // inset 0 0 2px 22px #000000;
  }
  a {
    // 去掉下划线
    text-decoration: none;
    background-image: radial-gradient(transparent 30%, rgba(101, 0, 0, 0.7) 70%);
    background-size: 5px 5px;
    border-radius: 5px;
    &:hover {
      color: #ffc97e;
    }
  }
}
li.active {
  box-shadow:
    inset -2px -2px 3px rgba(255, 255, 255, 0.589),
    inset 2px 2px 3px rgba(0, 0, 0, 0.6);

  a {
    color: #e63c3c;
  }
}
li.active::before {
  border-radius: 10px;

  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 50px;
  width: 80px;
  animation: flicker 0.2s infinite 0.3s;

  z-index: -1;
  background-image: radial-gradient(#ffc97e, #ff1818 40%, transparent 70%);

}
.left_side {
  grid-area: 3 / 1 / 170 / 4;
 
  border: 1px solid rgba(0, 213, 255, 0.4);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  text-align: center;
  font-size: 3rem;
}
.right_side {
  grid-area: 3 / 32 / 170 / 35;
  border: 1px solid rgba(0, 213, 255, 0.4);
}
.div4 {
  grid-area: 3 / 4 / 170 / 32;

  box-shadow:
    inset -2px -2px 3px rgba(255, 255, 255, 0.6),
    inset 2px 2px 3px rgba(0, 0, 0, 0.6);
  border-radius: 20px;
}
@keyframes flicker {
  0% {
    opacity: 1;
  }

  80% {
    opacity: 0.8;
  }

  100% {
    opacity: 1;
  }
}
</style>

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

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

相关文章

HarmonyOS开发案例:【UIAbility内和UIAbility间页面的跳转】

UIAbility内和UIAbility间页面的跳转&#xff08;ArkTS&#xff09; 介绍 基于Stage模型下的UIAbility开发&#xff0c;实现UIAbility内和UIAbility间页面的跳转。包含如下功能&#xff1a; UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页…

AtCoder Regular Contest 177 D. Earthquakes(概率 单调栈)

题目 D - Earthquakes 思路来源 官方题解 题解 对于不存在连锁反应的区间&#xff0c;每个区间独立处理&#xff0c;最后求个乘积 对于每个区间&#xff0c;相邻的两个杆子距离都小于H&#xff0c; 意味着没倒的区间是个连续的区间&#xff0c;假设要算i的概率 一定是第i…

软考144-下午题-【试题三】:UML图-类图、用例图

一、分值与目标 题型&#xff1a; 问题一~问题三&#xff08;扩展/UML——>设计模式&#xff09; 二、UML基础知识回顾 2-1、关系 UML中有四种关系&#xff1a;依赖、关联、泛化、实现。 1、关联 关联是一种结构关系&#xff0c;它描述了一组链&#xff0c;链是对象之间的…

Uniapp 自定义弹窗

布局 <view><view v-if"show" class"popup"><view class"popup-box"><view>支付方式:{{way}}</view><view>停车费用:{{money}}</view><view class"btn-box"><view class"ca…

修改el-checkbox样式

一定要在最外层&#xff1b; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

虚拟化技术 挂载iSCSI网络存储器

一、实验内容 挂载iSCSI网络存储器到ESXi主机 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装vSphere Client 三、实验步骤 1、挂载iSCSI网络存储器到ESXi主机 配置ESXi主机的虚拟网络 ESXi识别出三块…

【补充】图神经网络前传——DeepWalk

论文阅读 论文&#xff1a;https://arxiv.org/pdf/1403.6652 参考&#xff1a;【论文逐句精读】DeepWalk&#xff0c;随机游走实现图向量嵌入&#xff0c;自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一个网络中学习顶点…

039——解决室内不能使用GPS问题

目录 引入 GUI整改 client添加GPS分析 完善服务器网络通讯部分代码 添加GPS的BSW层 GPS操作部分代码&#xff08;相当于驱动&#xff09; 效果展示 项目管理操作 引入 最近在写论文加上出去玩了一圈所以停更了一段时间。上次咱们GPS有个室内用不了的问题&#xff0c;咱…

Ubuntu 24 换国内源及原理 (阿里源 清华源 中科大源 网易源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources 粘贴到文本&#xff08;其中一个即可&#xff09;&#xff1a; &#xff08;阿里源&#xff09…

与 Apollo 共创生态:Apollo 七周年大会带我体会自动驾驶技术的发展

前言 自动驾驶技术作为当今科技领域的热门话题&#xff0c;吸引着无数开发者和企业的目光。而在这个风起云涌的行业中&#xff0c;Apollo开放平台作为自动驾驶领域的领军者之一&#xff0c;扮演着不可或缺的角色。七年前&#xff0c;当Apollo开放平台刚刚起步时&#xff0c;也…

C语言(指针)5

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到?

等保一体机能过三级等保吗&#xff1f;过等保无需再买安全设备如何做到&#xff1f; 全云在线 2024-03-28 12:08 广东 尽管等保建设的标准是统一的&#xff0c;但由于不同行业和用户规模的差异&#xff0c;建设方案呈现出多样化的特点。 虽然重点行业过等保现象确实已经十分…

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中&#xff0c;客户的收入和负债数据大多无法直接获得&#xff0c;对于个人的收入和负债数据&…

中小型客户过等保,选择比努力重要!

国内谈网络安全&#xff0c;等保是绕不过去的话题。 作为国家网络安全保障的基本制度、基本策略、基本方法&#xff0c;等保经过十几年发展&#xff0c;其基本概念、相关标准已经深入人心&#xff0c;市面上各类成熟的等保方案让用户应接不暇&#xff0c;挑花了眼。 网络安全…

数据结构之排序(上)

片头 嗨&#xff0c;小伙伴们&#xff0c;大家好&#xff01;我们今天来学习数据结构之排序&#xff08;上&#xff09;&#xff0c;今天我们先讲一讲3个排序&#xff0c;分别是直接插入排序、冒泡排序以及希尔排序。 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

Docker:docker在项目中常用的一些命令

简介   Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何安装了 Docker 引擎的机器上。这些容器是轻量级的&#xff0c;包含了应用程序运行所需的所有东西&#xff0c;如代码、系统库、系统工具…

“数字化叙事的革命:人工智能驱动的创意工具的崛起”

近年来&#xff0c;人工智能 (AI) 改变了我们生活的许多方面&#xff0c;数字故事讲述的世界也不例外。随着人工智能驱动的创意工具的出现&#xff0c;广告商、内容创作者和专业人士现在配备了创新的解决方案来简化他们的工作流程&#xff0c;增强他们的创意输出&#xff0c;并…

08.4.grafana自定义图形并直接数据库取值

grafana自定义图形并直接数据库取值 自定义添加油表图形 选择gauge图形&#xff0c;并且配置对应设定值&#xff0c;点击应用 如图所示&#xff0c;可以看到仪表盘上的值是zabbix上取得值 配置grafana直接数据库取值 添加mysql数据源 添加后进行配置&#xff0c;我这…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…