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

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

<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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机服务器中了360后缀勒索病毒怎么解密,360后缀勒索病毒恢复

计算机网络技术的不断发展与应用&#xff0c;为企业的生产运营提供了极大便利&#xff0c;大大提高了企业的办公效率&#xff0c;为企业的生产运营注入了新的动力&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全带来严重威胁…

macos使用yarn创建vite时出现Usage Error: The nearest package directory问题

步骤是macos上使用了yarn create vite在window上是直接可以使用了yarn但是在macos上就出现报错 我们仔细看&#xff0c;它说的If /Users/chentianyu isnt intended to be a project, remove any yarn.lock and/or package.json file there.说是要我们清除yarn.lock和package.js…

深圳晶彩智能ESP32-1732S019实时观看GPIO的状态

深圳晶彩智能ESP32-1732S019介绍 ESP32-1732S019开发板是基于ESP32-S3-WROOM-1模块作为主控&#xff0c;双核MCU ,集成WI-FI和蓝牙功能&#xff0c;主控频率可达240MHz , 512KB SRAM , 384KB ROM&#xff0c;8M PSRAM&#xff0c;16MB Flash&#xff0c;显示分辨率为170*320 I…

职校智慧校园现状及问题分析

各大中职院校及高职院校是校园信息化的先行者和开拓者&#xff0c;很早就开始注重信息化基础设施建设和信息化人文素养的提升。在过去几年里&#xff0c;随着国家大力发展与扶植职校教育&#xff0c;学校投入相当的经费进行了校园信息通信网络、计算机等基础硬件设备建设&#…

单调栈问题

原理 单调栈的核心原理是&#xff1a;在栈内保持元素的单调性&#xff08;递增或递减&#xff09; 单调递增栈&#xff1a; 用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时&#xff0c;直接入栈&#xff1b;否则&#xff0c;一直从栈顶弹出元素&#xff0c…

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

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

金三银四面试题(二十七):适配器模式知多少?

什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换为客户期望的另一个接口。通过适配器&#xff0c;原本不兼容的接口可以一起工作&#xff0c;从而提高系统的灵活性和可扩展性。 关键元素&…

JVM 类的加载器

文章目录 1. 作用2. 类加载器的显示加载与隐式加载3. 类加载机制的必要性4. 加载的类是唯一的吗5. 类加加载机制的基本特征(了解) 1. 作用 类加载器是 JVM 执行类加载机制的前提。 ClassLoader 的作用&#xff1a; ClassLoader 是 Java 的核心组件&#xff0c;所有的 Class 都…

C++基础与深度解析 | C++初探 | Hello World | 系统I/O | 控制流 | 结构体与自定义数据类型

文章目录 一、从Hello World谈起二、系统I/O三、控制流四、结构体与自定义数据类型 一、从Hello World谈起 #include <iostream>void fun(const char *pInfo) {std::cout << pInfo << std::endl; }int main() {fun("Hello World!");fun("Hel…

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

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

求最大梯形的面积

【入门】求最大梯形的面积 今天做4星题单发现一个好玩的&#xff08;太简单了&#xff09;。 说明 从键盘读入n(3<n<100)个梯形的上底、下底和高&#xff0c;请问这n个梯形中&#xff0c;最大面积的梯形的面积是多少&#xff1f;&#xff08;梯形面积的求解公式为 S …

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

Rerank进一步提升RAG效果

RAG & Rerank 目前大模型应用中&#xff0c;RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;是一种在对话&#xff08;QA&#xff09;场景下最主要的应用形式&#xff0c;它主要解决大模型的知识存储和更新问题。 简述RAG without R…

买卖股票的最佳时机 II(LeetCode 122)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境&#xff0c;新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

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

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

centos7安装MySQL(rpm安装)

centos7安装MySQL&#xff08;rpm安装&#xff09; 准备工作1、卸载不要的环境2、获取MySQL官方yum源3、下载官方的yum源 安装可能遇到问题:描述解决方法&#xff1a; 配置添加远程访问用户设置MySql不区分大小写 准备工作 1、卸载不要的环境 grep mariadb # 先检查是否有mar…

【Java】/*方法的使用-快速总结*/

目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数&#xff0c;只是换了个名称而已。 二、方法的定义 1. 语法格式&#xff1a; public static 返回类型 方法名 (形参列表) { //方…

【GD32】02-ADC模拟数字转换器

ADC 在电子和通信技术中&#xff0c;ADC&#xff08;模拟数字转换器&#xff09;是一种将模拟信号转换为数字信号的电子设备。这种转换是电子系统中非常关键的一个环节&#xff0c;因为数字信号更易于处理、存储和传输。ADC的工作原理通常包括采样、保持、量化和编码等步骤。采…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…