Vue.js简单实现Todolist综合案例 (一) 选择完成或未完成 双击修改文本内容_vue 双击修改li内容-程序员宅基地

技术标签: Vue  vue  es6  

**Todolist综合案例(一)

Todolist Vue.js基本实现方法

我们先明白todolist这个案例的基本实现方法
循环遍历方法跟套用事件方法 比如 v-for v-if 这些常用的方法
todolist案例实用各种项目 基本样式也不会太大变化 说白了就是在俄罗斯套娃
我也是刚刚入门的新手

这边是效果实现图

在这里插入图片描述
首先我们先基本引入Vue.js的环境

cnpm install -g @vue/cli

然后在创建Vue的基本项目

vue create myapp

然后直接cd 进去项目myapp启动就行

 cd myapp

然后就正常启动

npm run serve

好了我们进入正题

我们先想一下todolist的大概流程
1.如图,文本框输入计划事件,回车之后,事件会出现在“正在进行”区域中,文本框清空。
2.点击事件前对应的复选框,事件会移至“已经完成”区域中,反之取消复选框勾选,事件会返回至“正在进行”区域中。
3.点击删除按钮,对应事件将会被删除。
4.刷新页面,数据不会清空(本地存储)。
5.点击“清除本地存储”按钮,刷新页面,数据将会清空

这边我们先写基本的CSS布局样式

<template>
  <div>
    <!-- 进行双向数据绑定 然后在给一个回车响应事件 -->
    <input type="text" v-model="list" @keydown.enter="add" />
    <!-- 获取数组里数据的长度 -->
    <h3>正在进行的{
    {
    Nolength}}</h3>
    <ul>
      <!-- 使用v-for进行遍历 -->
      <!-- v-show显示或隐藏的 完成和未完成的 把item打印的数据进行判断-->
      <li v-for="(item,index) in arry" :key="index" v-show="item.iscu==false">
        <!-- 给input一个点击事件判断选中是不是选中到完成到已完成里面 -->
        <input type="checkbox" @click.prevent="yes(item)" />
        <span class="item_title" v-if="uplist !=index" @click="eat(item,index)">{
    {
    item.title}}</span>
        <input
          type="text"
          v-if="uplist==index"
          v-model="item.title"
          @keydown.enter="off"
          @blur="off"
        />
        <!-- 给打印出来的数据一个删除方法 -->
        <button @click="del(index)">删除</button>
      </li>
    </ul>
    <!-- 判断已经完成的数组的完成的数量 -->
    <h3>已经完成了{
    {
    Yeslength}}</h3>
    <!-- 使用v-for进行遍历 -->
    <!-- v-show显示或隐藏的 完成和未完成的 把item打印的数据进行判断-->
    <li v-for="(item,index) in arry" :key="index" v-show="item.iscu==true">
      <input type="checkbox" checked @click.prevent="no(item)" />
      <span class="item_title" v-if="uplist !=index" @click="eat(item,index)">{
    {
    item.title}}</span>
      <input type="text" v-if="uplist==index" v-model="item.title" @keydown.enter="off" @blur="off" />
      <!-- 给打印出来的数据一个删除方法 -->
      <button @click="del(index)">删除</button>
    </li>
  </div>
</template>

上面就是基本css布局 每一步都打了注释 已经是很详细了
下面开始js部分的写法了

<script>
export default {
    
  data() {
    
    return {
    
      list: "", //一个的空的 来接受数据
      arry: [], //一个空的数组来接受数据
      uplist: -1, //要求修改元素的下标
      value: ""
    };
  },
  created() {
    
    //组件初始化  一开始就把本地数据加载出来
    let arry = localStorage.arry;
    if (arry) {
    
      // 用if判断把本地数据保存
      this.arry = JSON.parse(arry);
    }
  },
  methods: {
    
    add() {
    
      this.arry.push({
    
        title: this.list,
        iscu: false //判断完成状态 默认是未完成
      });
      this.list = "";
      //给一个空的
      this.save(); //保存数据到本地
    },
    del(index) {
    
      this.arry.splice(index, 1); //删除
      this.save(); //保存数据到本地
    },
    yes(item) {
    
      //判断input的选中是完成状态 利用上面的v-show判断
      item.iscu = true;
      this.save(); //保存数据到本地
    },
    no(item) {
    
      //判断input的选中是未完成状态 利用上面的v-show判断
      item.iscu = false;
      this.save(); //保存数据到本地
    },
    //为了保证页面刷新数据不会消失把数据保存到本地
    save() {
    
      localStorage.arry = JSON.stringify(this.arry); //保存数据到本地
    },

    eat(item, index) {
    
      this.uplist = index;
      this.value = item.title;
    },
    off() {
    
      this.uplist = -1;
      this.save();
    }
  },
  computed: {
    
    //计算属性 计算判断正在进行和完成的数组长度
    Yeslength() {
    
      let num = 0;
      this.arry.map(item => {
    
        if (item.iscu) {
    
          num++;
        }
      });
      return num;
    },
    Nolength() {
    
      let num = 0;
      this.arry.map(item => {
    
        //已经完成的数据可以跟上面一样取反就行了
        if (!item.iscu) {
    
          num++;
        }
      });
      return num;
    }
  }
};
</script>

**这边一个todolist的基本写法已经完成了

在给提几点建议跟注意事项

1.通过监听键盘的回车键,出发add方法,将输入的事件push进todoList中。其中,监听回车键是通过获取到keyCode判断是否为13来实现;push到todoList中的是一个对象,有things和isOver两个key值,其中things是事件内容,isOver是布尔类型,判断事件是否完成。

2.事件前面的checkbox需要与判断状态的变量(即data里面todoList的isOver)进行双向数据绑定,点击或取消勾选将会改变isOver的布尔值,通过此布尔值可以令事件有依据的出现在相应的区域中(未完成还是已结束)。未完成和已结束下的区域是两个不同的ui>li,利用v-for判断isOver的布尔值,从而对todoList中的数据进行渲染。

3.关于数据本地存储,通过localStorage.setItem()和localStorage.getItem()将todoList进行存储和获取。其中,当用户进行增加事件、删除事件、改变事件状态这三种操作时,均需要执行localStorage.setItem()。而获取本地存储的localStorage.getItem()则需要在mounted()生命周期函数中执行,实现打开网页时进行数据请求。

4.封装方法,对本地存储中数据的设置、获取、删除三个方法进行封装

5.注意数据存储时的类型,存时需要将数据转化成JSON字符串,获取时需要将数据转回JSON对象。
6.在取到localStorage中的list时,需要先判断是否存在,存在才能进行下一步的赋值给list[]数组,否则当list不存在的时候赋值会出错误。**

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Rick_and_mode/article/details/107044733

智能推荐

Qt基础 QT QTextEdit自动滑动_pyqt5中,qtextedit的消息实现滑条,能上滑定位历史消息-程序员宅基地

文章浏览阅读521次,点赞3次,收藏3次。获取QTextEdit的QScrollBar,然后再构造函数算出QScrollBar歩长pageStep(这里不知道为什么在其他地方算的步长很大),然后就定时器QScrollBar++或者--啦。最近公司在做一个提词项目,本来对这里功能难易感觉属于一般的,谁知道碰到一个很简单问题,搞了半天,先喷一下百度浏览器 不知道是算法越来越垃圾,还是我检索的有问题,还是说这个问题很难。那个End不用看意思就知道光标移动到文章尾部,还自动滚动,滚尼ma呢。严重标题与内容不符,别用猪脑写文章好不好!_pyqt5中,qtextedit的消息实现滑条,能上滑定位历史消息

掌控安全 暖冬杯 CTF Writeup By AheadSec-程序员宅基地

文章浏览阅读752次,点赞9次,收藏29次。本来结束时发到了学校AheadSec的群里面了的,觉得这比赛没啥好外发WP的,但是有些师傅来问了,所以还是发一下吧。

如何让vscode中的cmakelist高亮显示_linux vscode 代码高亮-程序员宅基地

文章浏览阅读4.5k次。因为甚少有人正确回答,其实很简单,安装插件cmake,居然被少有的几篇博客带偏,最后bing了国际版得到国际友人的指点https://github.com/microsoft/vscode-cmake-tools/issues/534没啥就是安装插件cmake_linux vscode 代码高亮

java 换行符 常量_6.java常量-程序员宅基地

文章浏览阅读1.1k次。Java中常量的分类:整数常量 : 所有整数小数常量 : 所有小数布尔常量 : 只有true和false字符常量 :使用’’引起来的单个字符字符串常量 :使用“”引起来的字符序列,“” 、“a” 、” ”null常量 : 只有一个值nullchar类型char类型表示的是单个字符类型,任何数据使用单引号括起来的都是表示字符。字符只能有一个字符,比如:普通的老百姓穿上军装就是军人。注意:特殊字符的..._java换行符用単引吗

计算机网络层之 P2P_p2p参与通信的主机叫-程序员宅基地

文章浏览阅读1.6k次。原文地址:http://write.blog.csdn.net/postedit一、什么是P2P对等网络(PeertoPeer,简称P2P)也称为对等连接,是一种新的通信模式,每个参与者具有同等的能力,可以发起一个通信会话。这个定义有点抽象,下面就来简单地解释一下。粗略地讲,应用程序可以设计成采用客户机/服务器体系结构或对等体系结构(P2P)。我们日常生活中的许多应用程_p2p参与通信的主机叫

Python连接MongoDB集群_python 连接mongodb集群-程序员宅基地

文章浏览阅读3.2k次。1、安装pyMongo(前提:必须安装了python和pip)打开cmd输入pip instal pymongo,等待安装完成;2、连接MongoDB代码如下:from pymongo import MongoClient, ReadPreferencedef db_conn(): client = MongoClient(['192.168.2.188:20000', '1..._python 连接mongodb集群

随便推点

simplexml_load_string-程序员宅基地

文章浏览阅读590次。2019独角兽企业重金招聘Python工程师标准>>> ...

Pygame 外星人入侵(5)发射子弹-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏9次。Pygame 外星人入侵(5)发射子弹目录Pygame 外星人入侵(5)发射子弹引言一、定义子弹类1、增加子弹相关的设置参数2、新增子弹模块3、定义子弹类二、发射子弹1、实现发射逻辑2、优化1:删除出界的子弹3、优化2:限制子弹数量三、代码封装四、小结引言在之前的博文中,我们实现了游戏屏幕的绘制、飞船的绘制以及玩家通过按键来操控飞船移动的功能。在这篇博文中,将会完成让玩家飞船发射子弹的功能。一、定义子弹类我们既然要 “发射”“子弹”,那么首先就必须要有可发射的“子弹”。所以我们需要自己定义一个

「前端学习」Vue 两个版本(完整版和非完整版)的区别和使用方法:_vue 使用 cnd 需要引入 vue-template-compiler 模板编辑吗-程序员宅基地

文章浏览阅读575次。文章目录1.两个版本对应的文件名2.template 和 render 怎么用3.如何用 codesandbox.io 写 Vue 代码两个版本的主要区别:Vue完整版Vue非完整版评价特点有compilerm诶呦compilercompiler占40%的体积视图写在HTML里或者写在template选项卸载render函数里用h来创建标签h是尤雨溪写好传给render的cnd引入vue.jsvue.runtime.js文件名不同,生成环境后缀为.m_vue 使用 cnd 需要引入 vue-template-compiler 模板编辑吗

ORA-01918: 用户 'SCOTT' 不存在 解决方法_?????: ora-01918: ?? 'scott' ???-程序员宅基地

文章浏览阅读7.6k次。SQL&gt; alter user scott account unlock;alter user scott account unlock*第 1 行出现错误:ORA-01918: 用户 ‘SCOTT’ 不存在找到scott.sql 文件SQL&gt; @D:\tudou\product\11.2.0\dbhome_1\RDBMS\ADMIN\scott.sqlSQL&gt; conn..._?????: ora-01918: ?? 'scott' ???

Arduino grove 继电器_grove relay-程序员宅基地

文章浏览阅读288次。继电器 arduinoSIG -> D4VCC -> 5VGND -> GNDint relayPin = 4;void setup() { // put your setup code here, to run once: pinMode(relayPin, OUTPUT);}void loop() { //..._grove relay

ubuntu 搭建LAMP(Apache+PHP+MYSQL)开发环境-程序员宅基地

文章浏览阅读772次。(1)安装MYSQLsudo apt-get install mysql-server mysql-client(2)安装Apachesudo apt-get install apache2(3)安装PHPsudo apt-get install php5 libapache2-

推荐文章

热门文章

相关标签