首页 > 其他分享 >vue案例

vue案例

时间:2024-05-08 21:33:22浏览次数:24  
标签:vue return name item app 案例 data id

任务清单(单文件)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>模板</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.js"></script>
    <style>
        table {
            border: 1px solid black;
            border-collapse: collapse;
        }

        tr,
        td {
            border: 1px solid black;
            text-align: center;
            padding: 10px;
        }
    </style>
</head>

<body>
    <div id="app">
        <h3>小满记事本</h3>
        <p><input type="text" v-model="text" @keyup.enter="addTask"> <button @click="addTask">添加任务</button> <button
                @click="clear" v-show="taskList.length > 0">清空任务</button></p>
        <table v-show="taskList.length > 0">
            <tr>
                <td>任务id</td>
                <td>任务内容</td>
                <td colspan="2">操作</td>
            </tr>
            <tr v-for="(task, index) in taskList" :key="task.id">
                <td>{{index+1}}</td>
                <td>{{task.name}}</td>
                <td><button @click="changeTask(task)">修改任务</button></td>
                <td><button @click="del(task.id)">删除任务</button></td>
            </tr>
        </table>
        <p v-show="taskList.length > 0">任务数量: {{taskList.length}} </p>
        <br>
        <!-- 修改任务的时候会用到 -->
        <div v-show="isShow">
            <label>请输入新的任务内容<input type="text" v-model="newText"></label> <button @click="relChange">确认修改</button>
        </div>
    </div>
</body>
<script>
    const app = new Vue({
        el: "#app",
        data: {
            taskList: [
                { "id": 1, "name": "欺负小满" },
                { "id": 2, "name": "逃课" }
            ],
            text: "",
            newText: "",
            isShow: 0,
            // 需要被修改的对象
            changeOBJ: null,
        },
        methods: {
            // 新增任务
            addTask() {
                if (this.text !== "") {
                    this.taskList.push(
                        { id: this.taskList.length + 1, name: this.text }
                    )
                    this.text = ""
                } else {
                    alert("请输入任务名称!")
                }
            },

            // 删除任务 根据id去删除
            del(id) {
                this.taskList = this.taskList.filter(item => item.id !== id)
            },

            // 首次修改
            changeTask(obj) {
                this.isShow = 1
                this.changeOBJ = obj
            },

            // 最终修改
            relChange() {
                this.changeOBJ.name = this.newText
                alert("任务修改成功!")
                this.isShow = 0
            },

            // 清空任务
            clear() {
                this.taskList = []
            }
        },
    })
</script>

</html>

效果演示

img

任务清单(组件版)

  1. 父子通信,遵循单文件流原则
  2. 自己的数据自己负责,即虽然数据是从父传给子的,但是修改还是要子传给父,然后父操作修改或者删除
  3. 别忘记加scoped,保证样式互不影响
  4. 持久化存储 watch ,created里面,深度监视 deep

持久化存储更简单的写法

list: JSON.parse(localStorage.getItem("data")) || [默认数组]

NoteDetail.vue

<template>
  <div class="note-detail">
    <!-- 头部 -->
    <ToDoHeader @addTask="addTask"></ToDoHeader>
    <br>
    <!-- 身体 -->
    <ToDoMain :list="list" @delTask="delTask"></ToDoMain>
    <br>
    <!-- 底部 -->
    <ToDoFooter :list="list" @clearTask="clearTask" v-show="list.length > 0"></ToDoFooter>
  </div>
</template>

<script>
import ToDoHeader from "@/components/ToDoHeader.vue";
import ToDoMain from "@/components/ToDoMain.vue";
import ToDoFooter from "@/components/ToDoFooter.vue";
export default {
  components: {
    ToDoHeader,
    ToDoMain,
    ToDoFooter,
  },
  data() {
    return {
      baseLsit: [
        { id: 1, name: "按时吃饭" },
        { id: 2, name: "按时摸鱼" },
        { id: 3, name: "按时学习" },
      ],
        // 传递给子组件的数组 这里置空了因为数据从本地读取
      list: [],
      // 用来控制当数据为空的适合 底部组件是否显示
      isShow: true
    };
  },
  created() {
    // 如果能从本地读取到数据,默认的数据就从本地获取
    // 如果读取不到 默认数据就从初始化的baseList获取
    if (localStorage.getItem('data')){
      this.list = JSON.parse(localStorage.getItem('data'))
    }else{
      this.list = this.baseLsit
    }
  },
  methods: {
    // 添加单个任务
    addTask(value){
        this.list.unshift({
            id: this.list.length + 1,
            name: value
        })
    },
    // 删除单个任务
    delTask(id){
        this.list = this.list.filter(item => item.id !== id)
    },
    // 清空全部任务
    clearTask(value){
        this.list = value
    }
  },
  watch: {
    list: {
      deep: true,
      handler(newValue){
        // 持久化到本地
        localStorage.setItem("data", JSON.stringify(newValue))
      }
    }
  }
};
</script>

<style scoped>
.note-detail {
  margin: 50px;
  width: 500px;
  /* height: 300px; */
  background-color: tomato;
  padding: 50px;
}
</style>

ToDoHeader.vue

<!-- ToDoHeader.vue -->
<template>
  <div class="todo-header">
    <p>
        <label><input type="text" placeholder="请输入任务名称" v-model="task" @keyup.13="addTask"></label>
        &emsp;
        <button @click="addTask" class="btn btn-dark">添加任务</button>
    </p>
  </div>
</template>

<script>
export default {
    data() {
        return {
            task: ""
        }
    },
    methods: {
        addTask(){
            if (this.task.trim() === ''){
                alert('不能为空')
                return
            }
            // 添加让父组件添加
            this.$emit("addTask", this.task)
            // 清空默认的输入
            this.task = ''
        }
    },
}
</script>

<style scoped>
    .todo-header p {
        margin: auto;
        width: 80%;
    }
</style>

ToDoMain.vue

<!-- ToDoMain.vue -->
<template>
  <div class="todo-main">
    <ul v-for="(item, index) in list" :key="item.id">
      <li>
        <span>{{ index + 1 }} {{ item.name }}</span>
        <span @click="del(item.id)">x</span>
      </li>
      <hr>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    list: {
      type: Array,
      required: true,
    },
  },
  methods: {
    del(id){
        this.$emit("delTask", id)
    }
  },
};
</script>

<style scoped>
    .todo-main ul {
    list-style: none;
    }
    li {
        /* text-indent: 2em; */
        margin: 0 10px 0 10px;
        display: flex;
        justify-content: space-between
    }
</style>

ToDoFooter.vue

<!-- ToDoFooter.vue -->
<template>
  <div class="todo-footer">
    <div class="inner">
      <span>合计:{{ totalCount }}</span>
      <span><button @click="clearTask" class="btn btn-danger">清空任务</button></span>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    list: {
      type: Array,
      required: true,
      default: () => [],
    },
  },
  computed: {
    totalCount() {
      return this.list.length;
    },
  },
  methods: {
    clearTask(){
        this.$emit("clearTask", [])
    }
  },
};
</script>

<style scoped>
    div.inner {
        display: flex;
        justify-content: space-between;
    }
    span {
        font-weight: 700;
        color: #fff;
    }
</style>

效果演示

img

成绩计算

案例用到的

  1. 渲染功能,用到了v-for,渲染的时候使用的是index,这样保证序号的准确性,别忘记

    标签:vue,return,name,item,app,案例,data,id
    From: https://www.cnblogs.com/ccsvip/p/18180920

相关文章

  • 案例分析:通过两个学生项目的例子,推断出这些团队的血型:1、STG游戏的跳票(为了完美,推迟了
    案例分析:通过两个学生项目的例子,推断出这些团队的血型:1、STG游戏的跳票(为了完美,推迟了7天,但是7天之后也没有发布……)我怀着无比沉痛的心情宣布,我们的游戏因尚未达到预期的可玩性,为了不丢人现眼,延迟发布i天(i<=7)。我们在起初的计划中,以发布后一周的下载量作为项目衡量的标准。虽......
  • 第11周案例分析
    答:从这两个学生项目的例子中,我们可以推断出这些团队在项目管理和时间管理方面存在一些问题。以下是对这两个案例的分析:STG游戏跳票案例:项目管理问题:项目团队在项目初期就设定了一个明确的发布日期,但最终未能按时发布。这表明团队在时间估计和项目进度控制方面可能存在不......
  • 案例分析:通过两个学生项目的例子,推断出这些团队的血型:
    根据这两个案例,我们可以推断出两个团队的血型:STG游戏团队:这个团队倾向于AB型血。他们非常注重完美主义,愿意为了达到自己设定的标准而推迟项目发布。然而,这种完美主义可能导致项目进度受阻,甚至出现跳票的情况。他们会花费额外的时间和精力来确保产品质量,但有时会忽视时间管理和项......
  • uniapp+vue H5页面实现微信公众号授权登录
    <template><viewclass="my-userinfo-container"><!--头像和昵称区域--><viewclass="top-box"><image:src="form.headimgurl"class="avatar"></image>......
  • 拉取VUE并运行
    一、通过从git项目中拉取项目后初次并启动运行1、在vscode从git获取拉取项目2、拉取项目后启动运行(需要先安装npm ---npminstall)安装报错 解决:1、复制这个路径,打开文件夹 (找到npm的安装路径,查看是否有node.exe的启动文件。)打开后会发现没有 2、找到node的安装......
  • Vue
    VUE2https://v2.cn.vuejs.org/(1)介绍VUE是渐进式框架可以一点一点地使用它,只用一部分,也可以整个工程都使用它Vue特点易用通过HTML、CSS、JavaScript构建应用灵活不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩。高效20kBmin+gzip运行大小超快虚......
  • Vue2工程化介绍
    Vue2项目[基于vue-cli]工程化【一】环境搭建06-Vue-cli-刘清政-博客园(cnblogs.com)安装node使用npm/cnpmnpm换源:npmconfigsetregistryhttps://registry.npmmirror.com安装vue-clicnpminstall-g@vue/cli#安装脚手架cnpminstall-g@vue/cli#切换目录......
  • 解决Vue项目在IIS部署中路由不存在导致的404错误问题
    最近Vue项目部署到IIS时遇到了一个问题:当输入不存在的路由时,页面会报下图的404错误,这样会导致我们的信息暴露,非常不安全,解决这个问题也很简单,通过配置网站的url重写即可解决这个问题。参考文章:https://blog.csdn.net/qq_40323256/article/details/124384969解决方法:给IIS部署的......
  • 探索网站支付系统的奥秘,从Vue3和Spring Boot开始(入门级项目实战+在线教程)附赠项目源码
    你是否曾经在购物时,对着电脑屏幕前的“支付成功”四个字感到好奇?这背后的秘密究竟是什么?今天,让我们一起揭开支付系统的神秘面纱,探索其背后的技术实现。在这个基于Vue3和SpringBoot的支付项目实战中,我们将带你一步步了解支付系统的实现思路。这个项目不仅解决了常用支付方式的......
  • 日常系统批处理优化案例(来源网络)
    @ECHOoffECHO关闭WindowsDefenderregadd"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\WindowsDefender"/v"DisableAntiSpyware"/d1/tREG_DWORD/fecho完成ECHO关闭Windows防火墙regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Polici......