用智能插件(Fitten Code: Faster and Better AI Assistant)修改好了可以持久保存的vue3留言板

news2024/11/15 19:57:26

天际

 第一修改是选项式:

<!-- 模板结构 -->
<template>
  <div>
    <textarea  placeholder="请输入备注内容" v-model="newItem"></textarea>
    <button @click="addItem">添加</button>
    <hr>
    <div class="text">
      <div v-for="(item, index) in items" :key="index" :class="{ 'finish': item.finish }">
        <button @click="removeItem(index)">删除</button>
        <button @click="toggleFinish(index)">{{ item.finish ? '取消' : '完成' }}</button>
        <span class="content">{{ item.name }}</span>
      </div>
    </div>
  </div>
</template>
<!-- 脚本行为 -->
<script>
export default {
  data() {
    return {
      newItem: '',
      items: []
    };
  },
  mounted() {
    this.loadTodo();
  },
  methods: {
    addItem() {
      this.items.push({ name: this.newItem, finish: false });
      this.saveTodo();
      this.newItem = '';
    },
    removeItem(index) {
      this.items.splice(index, 1);
      this.saveTodo();
    },
    toggleFinish(index) {
      this.items[index].finish = !this.items[index].finish;
      this.saveTodo();
    },
    saveTodo() {
      localStorage.setItem('mylogs', JSON.stringify(this.items));
    },
    loadTodo() {
      const savedItems = JSON.parse(localStorage.getItem('mylogs'));
      if (savedItems) {
        this.items = savedItems;
      }
    }
  }
};
</script>
<!-- 组件样式 -->
<style>
.finish {
  text-decoration: line-through;
  text-shadow: 2px 2px 2px LightslateGray;
  box-shadow: 0 0 10px 5px rgba(255, 255, 255, 0.916);
}
</style>

第2次修改

<template>
  <div>
    <textarea      
      placeholder="请输入备注内容"
      v-model="newItem"
    ></textarea>
    <button @click="addItem">添加</button>
    <hr />
    <div class="text">
      <div
        v-for="(item, index) in items"
        :key="index"
        :class="{ finish: item.finish }"
      >
        <button @click="removeItem(index)">删除</button>
        <button @click="toggleFinish(index)">
          {{ item.finish ? "取消" : "完成" }}
        </button>
        <span class="content">
          {{ index + 1 }}.{{ item.name }}
          {{ item.finish ? "(已完成)" : "" }}</span
        >
      </div>
    </div>
  </div>
</template>

<script >
  import { ref, onMounted } from "vue";

  export default {
    setup() {
      const newItem = ref("");
      const items = ref([]);

      const addItem = () => {
        items.value.push({ name: newItem.value, finish: false });
        saveTodo();
        newItem.value = "";
      };

      const removeItem = (index) => {
        items.value.splice(index, 1);
        saveTodo();
      };

      const toggleFinish = (index) => {
        items.value[index].finish = !items.value[index].finish;
        saveTodo();
      };

      const saveTodo = () => {
        localStorage.setItem("mylogs", JSON.stringify(items.value));
      };

      const loadTodo = () => {
        const savedItems = JSON.parse(localStorage.getItem("mylogs"));
        if (savedItems) {
          items.value = savedItems;
        }
      };

      onMounted(() => {
        loadTodo();
      });

      return {
        newItem,
        items,
        addItem,
        removeItem,
        toggleFinish,
        saveTodo,
        loadTodo
      };
    }
  };
</script>

<style scoped>
  .finish {
    text-decoration: line-through;
    text-shadow: 2px 2px 2px LightslateGray;
    box-shadow: 0 0 10px 5px rgba(255, 255, 255, 0.916);
  }
</style>

 第3次修改

<template>
  <div class="view">
    <!-- 左侧按钮 -->
    <div class="view_left">
      <button class="btn_checkbox">
        操作<input type="checkbox" v-model="showInput" value="操作" />
      </button>
      <button class="del_checkbox">
        删除 <input type="checkbox" v-model="showInput2" value="删除" />
      </button>
    </div>
    <!-- 中间内容 -->
    <div class="view_content">
      <!--  -->
      <div class="textarea_div">
        <textarea
          class="text-input-box"
          placeholder="请输入备注内容"
          v-model="newItem"
          v-if="showInput"
        ></textarea>
        <button @click="addItem" v-if="showInput">添加</button>
      </div>
      <!--  -->
      <div class="div_list">
        <div class="text">
          <div v-for="(item, index) in items" :key="index" :class="{ finish: item.finish }">
            <button @click="removeItem(index)" v-if="showInput2">删除</button>
            <button @click="toggleFinish(index)">
              {{ item.finish ? '取消' : '完成' }}
            </button>
            <button v-if="showInput" @click="edit(index)">编辑</button>

            <span class="content">
              <button class="numb">{{ index + 1 }}</button> {{ item.name }}
              {{ item.finish ? '(已完成)' : '' }}</span
            >
            <span v-show="oindex == index ? true : false" class="textarea_div">
              <textarea v-model="newItem"></textarea>
              <button @click="csu">提交</button>
            </span>
          </div>
        </div>
      </div>
    </div>
    <!-- 右侧按钮 -->
    <div class="view_right"></div>
  </div>
</template>

<script setup>
// import '@/assets/styles/view.scss'
// import '@/assets/styles/jottings_memo.scss'
// import '../../assets/styles/input_checkbox.scss'
import { ref, onMounted } from 'vue'
const showInput = ref(false)
const showInput2 = ref(false)
const newItem = ref('')
const items = ref([])
const oindex = ref(-1)

const addItem = () => {
  items.value.push({ name: newItem.value, finish: false })
  saveTodo()
  newItem.value = ''
}
const removeItem = (index) => {
  items.value.splice(index, 1)
  saveTodo()
}
const edit = (index) => {
  if (newItem.value === '' || false) {
    newItem.value = items.value[index].name

    oindex.value = index
  } else {
    newItem.value = ''
    oindex.value = -1
  }
}
const csu = () => {
  if (oindex.value === -1) {
    return
  }
  items.value[oindex.value].name = newItem.value
  oindex.value = -1
  newItem.value = ''
  saveTodo()
}

const toggleFinish = (index) => {
  items.value[index].finish = !items.value[index].finish
  saveTodo()
}

const saveTodo = () => {
  try {
    localStorage.setItem('jottings', JSON.stringify(items.value))
  } catch (error) {
    console.error('Failed to save todo items to localStorage:', error)
    // 可以添加适当的错误处理逻辑,比如向用户显示错误信息
  }
}

const loadTodo = () => {
  try {
    const savedItems = JSON.parse(localStorage.getItem('jottings'))
    if (savedItems) {
      items.value = savedItems
    }
  } catch (error) {
    console.error('Failed to load todo items from localStorage:', error)
    // 可以添加适当的错误处理逻辑,比如向用户显示错误信息
  }
}

onMounted(() => {
  loadTodo()
})
</script>

<style scoped>
.btn_checkbox,
.del_checkbox {
  box-shadow:
    inset -2px -2px 3px rgba(255, 255, 255, 0.589),
    inset 2px 2px 3px rgba(0, 0, 0, 0.6);
  border-radius: 50px;
  font-size: 20px;
  margin: 0px 0 0 0px;
  width: 40px;
  transform: translate(20px, 0px);
  input[type='checkbox'] {
    top: 3px;
    left: -4px;
  }
}
.del_checkbox {
  color: #ff0000;
  background-color: #f56c6c;
  margin-left: 10px;
}
button {
  background-color: #67c23a;
  color: #e6a23c;
  border-radius: 3px;
  border: 2px solid#ccc;
}
.div_list {
  overflow-x: auto;
  overflow-y: auto;
  display: flex;
  flex-wrap: wrap;
  border-radius: 10px;

  width: 84vw;
  height: 90vh;
  padding: 20px;
  border: 2px solid #ccc;
  .content {
    word-wrap: break-word;
    user-select: text;
    color: #8ac5ff93;
    font-size: 20px;
    &:hover {
      color: hsla(160, 100%, 37%, 1);
      text-shadow: 1px 1px 1px #000000;
      box-shadow: 0 0 10px 5px rgba(255, 255, 255, 0.916);
      border-radius: 50px;
      background-color: rgb(191, 210, 255);
    }
  }
}
.textarea_div {
  display: flex;
  textarea {
    background-color: #144756;
    color: #fff;
    font-size: 20px;
    height: 21px;
  }
}
.view_content .textarea_div {
  position: absolute;
}
.text {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
  gap: 20px;
}
.finish {
  text-decoration: line-through;
  box-shadow: 0 0 10px 5px rgba(255, 255, 255, 0.916);
  background-color: rgb(191, 210, 255);
  border-radius: 50px;
  text-shadow: 1px 1px 1px #030303;
  box-shadow:
    inset -2px -2px 3px rgba(255, 255, 255, 0.6),
    inset 2px 2px 3px rgba(0, 0, 0, 0.6);
}
.numb {
  border-radius: 50px;
  color: hsla(160, 100%, 37%, 1);
  text-shadow: 1px 1px 1px #000000;
}

</style>

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

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

相关文章

HAL库点LED灯

文章目录 一、创建CubeMX项目操作步骤1.STM32CubeMX创建工程2.选择芯片3.Pinout & Configuration配置4.Clock Configuration配置5.Project Manager配置 二、实验&#xff08;一&#xff09;LED流水灯1.Keil修改代码2.实验现象3.keil波形仿真 &#xff08;二&#xff09;2只…

JVM学习-堆空间(一)

堆空间 每个进程&#xff08;JVM实例&#xff09;拥有唯一的方法区和堆空间&#xff0c;拥有唯一的Runtime实例(基于饿汉式方式)&#xff0c;线程共享进程的方法区和堆空间&#xff0c;每个线程拥有独立的程序计数器、本地方法栈和虚拟机栈。 一个JVM实例只存在一个堆内存&am…

MySQL主从复制(三):主从延迟

主备流程图&#xff1a; 谈到主备的复制能力&#xff0c;要关注的是上图中的两个黑色箭头。 一个箭头代表了客户端写入主库&#xff0c;另一个箭头代表的是sql_thread执行中转日志&#xff08;relay log&#xff09;。如果用箭头的粗细来代表并行度的话&#xff0c;那么真实情…

spring-boot集成slf4j(二)logback配置详解

一、configuration 根节点&#xff1a;configuration&#xff0c;作为顶级标签&#xff0c; 可以用来配置一些lockback的全局属性&#xff0c;常见的属性如下&#xff1a; &#xff08;1&#xff09;scan“true” &#xff1a;scan是否开启自动扫描&#xff0c;监控配置文件更…

【Crypto】看我回旋踢

文章目录 一、看我回旋踢二、知识点什么是ROT13&#xff1f;工作原理分析字符串格式 解题感悟 一、看我回旋踢 关键词回旋&#xff0c;盲猜ROT13 因为以 synt{ 开头&#xff0c;并以 } 结束&#xff0c;基本可以判断是ROT13 小小flag&#xff0c;拿下&#xff01; 二、知识点 …

Algoriddim djay Pro Ai for Mac:AI引领,混音新篇章

当AI遇上音乐&#xff0c;会碰撞出怎样的火花&#xff1f;Algoriddim djay Pro Ai for Mac给出了答案。这款专业的DJ混音软件&#xff0c;以AI为引擎&#xff0c;引领我们进入混音的新篇章。 djay Pro Ai for Mac的智能混音功能&#xff0c;让每一位DJ都能感受到前所未有的创作…

LAMDA面试准备(2024-05-23)

有没有学习过机器学习&#xff0c;提问了 FP-Growth 相比 Apriori 的优点 1. 更高的效率和更少的计算量&#xff08;时间&#xff09; FP-Growth 通过构建和遍历 FP-树 (Frequent Pattern Tree) 来挖掘频繁项集&#xff0c;而不需要像 Apriori 那样生成和测试大量的候选项集。具…

GQL 来了!ISO/IEC 正式发布 GQL 数据库国际标准!

历时四年筹备&#xff0c;超过20个国家的标准和技术专家参与制定&#xff0c;ISO/IEC GQL &#xff08;图查询语言&#xff09;标准于2024年4月12日正式发布&#xff01; 作为国际标准化组织&#xff08;ISO&#xff09;继 1987年 发布SQL后&#xff0c;唯一发布的数据库查询语…

数据库迁移——kettle开发01

背景&#xff1a;数据库的多种多样&#xff0c;在搭建项目之初&#xff0c;并没有详细考虑到数据库的建设&#xff0c;当增加配置不能满足业务场景需要时&#xff0c;这时候考虑到使用更高性能的数据库&#xff0c;如将MySQL更换为oracle数据库。或者在搭建新项目时&#xff0c…

【EXCEL_VBA_基础知识】08 在VBA中使用公式 ※

课程来源&#xff1a;王佩丰老师的《王佩丰学VBA视频教程》&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 目录 1. 函数在哪找&#xff1f; 1.1 工作表函数&#xff08;Application.WorksheetFunction.func&#xff09; 1.2 VBA函数 2. 常用VBA变量 3. 函数应用…

如何做好云安全防护

随着云计算技术的迅猛发展和普及&#xff0c;越来越多的企业和个人选择将数据和业务应用迁移到云平台&#xff0c;以享受其带来的高效、便捷和可扩展性。然而&#xff0c;云环境的复杂性和开放性也带来了前所未有的安全挑战。如何确保云环境中的数据安全&#xff0c;成为了每一…

瑞米派Ubuntu系统移植指南-米尔RemiPi

1.概述 Linux系统平台上有许多开源的系统构建框架&#xff0c;这些框架方便了开发者进行嵌入式系统的构建和定制化开发&#xff0c;目前比较常见的有Buildroot, Yocto, OpenEmbedded等等。 同时更多的传统的桌面系统也加入到嵌入式环境体系中&#xff0c;如Ubuntu&#xff0c…

微信小程序使用input标签遇到的问题

场景1&#xff1a;多个input标签切换无法聚焦问题 解决方案1&#xff1a; 在网上搜的用官方给的always-embed属性&#xff0c;但是也明确标注了只有ios可用 解决方案2&#xff1a; 使用focus属性&#xff1a;每次点击input标签都重新设置 wxml: <input adjust-position…

一文带你了解所有常用排序算法

目录 快速排序 堆排序 桶排序 归并排序 拓扑排序 本文主要介绍那些我在刷题过程中常用到的排序算法: 快速排序,堆排序,桶排序,归并排序,拓扑排序 其余算法例如冒泡,插入这种效率特别低的算法就不介绍了,用的可能性极小 每一个算法都将采用例题加解释的方式进行介绍 快速…

文心智能体应用示例:职场反PUA专家的诞生

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

LangChain llamaindex

LangChain 参考&#xff1a; 全流程 | Windows 系统本地部署开源模型阿里通义千问 QWEN 1.5&#xff0c;结合 LangChain-Chatchat 框架和向量数据库 FAISS、Milvus - 知乎

蓝桥杯-数三角(ac代码时间复杂度分析)

问题描述 小明在二维坐标系中放置了 ( n ) 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形&#xff1f…

Convolutional Occupancy Networks【ECCV2020】

论文&#xff1a;https://arxiv.org/pdf/2003.04618 代码&#xff1a;GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1&#xff1a;卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构&#xff0c;表现能力…

【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

4月空调行业线上市场销售数据分析

随着生活品质的提升&#xff0c;消费者对家用空调的诉求不仅仅满足于基本制冷制热功能&#xff0c;而是在环保节能、功能升维、舒适送风、智能科技、焕新设计等多维度提出需求。这种多样化的需求推动了空调产品的创新和升级&#xff0c;这不仅提高了空调的市场竞争力&#xff0…