首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Vue.js todo应用程序

Vue.js todo应用程序
EN

Code Review用户
提问于 2021-05-18 05:52:21
回答 1查看 135关注 0票数 1

我正在用Vue (v2.x.x)开发一个小型的待办事项应用程序。我最初列出了来自jsonplaceholder的5项待办事项。

我可以添加更多的待办事项,删除他们或标记他们做了。

代码语言:javascript
运行
AI代码解释
复制
var app = new Vue({
  el: "#toDoApp",
  data: {
    url: "https://jsonplaceholder.typicode.com/todos?&_limit=5",
    dataIsLoaded: false,
    isValidInput: true,
    todos: [],
    unsolvedTodos: [],
    newTitle: "",
  },
  mounted() {
    axios.get(this.url)
      .then((response) => {
        this.todos = response.data;
      })
      .then(this.getUnsolvedTodos);
    this.dataIsLoaded = true;
  },
  methods: {
    getUnsolvedTodos: function() {
      this.unsolvedTodos = this.todos.filter(todo => {
        return todo.completed === false;
      });
    },
    // toggle todo
    toggleTodo: function(todo) {
      todo.completed = !todo.completed;
      // Update unsolved count
      this.getUnsolvedTodos();
    },
    // delete todo
    deleteTodo: function(id) {
      this.todos = this.todos.filter(todo => todo.id !== id);
      // Update unsolved count
      this.getUnsolvedTodos();
    },
    // validate todo title
    validateInput: function() {
      this.isValidInput = this.newTitle.length >= 3 ? true : false;
    },
    // add todo
    addTodo: function() {
      let lastId = this.todos.length === 0 ? 0 : this.todos[this.todos.length - 1].id;
      const newToDo = {
        id: lastId + 1,
        title: this.newTitle,
        completed: false
      }

      this.validateInput();

      if (this.isValidInput) {
        this.todos.push(newToDo);
        this.newTitle = "";
      }

      // Update unsolved count
      this.getUnsolvedTodos();
    }

  },
  created() {},
  watch: {}
});
代码语言:javascript
运行
AI代码解释
复制
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap");
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Poppins", sans-serif;
}

.app-wrapper {
  height: 100vh;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: #0093e9;
  background-image: linear-gradient(160deg, #0093e9 0%, #80d0c7 100%);
}

#toDoApp {
  width: 320px;
  height: 320px;
  display: flex;
  flex-direction: column;
  background: #fff;
  box-shadow: rgb(99 99 99 / 20%) 0px 2px 8px 0px;
  overflow: hidden;
  border-radius: 8px;
  position: relative;
}

header {
  padding: 15px 20px;
  background: #efefef;
  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
  font-size: 18px;
  font-weight: 600;
  display: flex;
}

header .title {
  font-size: 18px;
  font-weight: 600;
  color: #323232;
}

header .count {
  margin-left: auto;
  display: inline-block;
  width: 26px;
  line-height: 26px;
  text-align: center;
  border-radius: 3px;
  font-size: 13px;
  background: #c00;
  color: #fff;
}

header .count.zero {
  background: #009688;
}

.todo-list {
  flex: 1;
  overflow-y: auto;
  list-style-type: none;
  padding: 15px 20px 5px 20px;
  color: #4f4f4f;
}

::-webkit-scrollbar {
  width: 5px;
}


/* Track */

::-webkit-scrollbar-track {
  background: #efefef;
}


/* Handle */

::-webkit-scrollbar-thumb {
  background: #d0d0d0;
}


/* Handle on hover */

::-webkit-scrollbar-thumb:hover {
  background: #d0d0d0;
}

.todo-list li {
  position: relative;
  display: flex;
  overflow: hidden;
  align-items: center;
  font-size: 13px;
  padding: 10px;
  cursor: pointer;
  margin-bottom: 7px;
  border: 1px solid rgba(0, 0, 0, 0.07);
  background: #d4e7f7;
  border-radius: 2px;
}

.todo-list li:last-child {
  margin-bottom: 0;
}

.done {
  text-decoration: line-through;
}

input[type="checkbox"] {
  display: block;
  margin-bottom: -1px;
  margin-right: 7px;
}

button {
  border: none;
  background: #c00;
  color: #fff;
  cursor: pointer;
  position: absolute;
  z-index: 1;
  top: -1px;
  bottom: -1px;
  right: -1px;
  font-size: 18px;
  width: 50px;
  transform: translateX(50px);
  transition: transform 200ms;
}

.todo-list li:hover button {
  transform: translateX(0);
}

footer {
  padding: 15px 20px 25px 20px;
  margin-top: auto;
  position: relative;
}

.error {
  position: absolute;
  top: 5px;
  right: 22px;
  font-size: 11px;
  color: #c00;
}

input[type="text"] {
  width: 100%;
  padding: 2px 4px;
  border: none;
  font-size: 16px;
  outline: none;
  border-bottom: 2px solid #b8b8b8;
  transition: border-bottom 200ms ease-in;
}

input[type="text"]:focus {
  border-bottom: 2px solid #dddddd;
}

.loader {
  border: 4px solid #ccc;
  border-top-color: transparent;
  border-radius: 50%;
  width: 50px;
  height: 50px;
  position: absolute;
  top: 50%;
  margin-left: -25px;
  left: 50%;
  margin-top: -25px;
  animation: spin 2s linear infinite;
}

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
代码语言:javascript
运行
AI代码解释
复制
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js"></script>

<div class="app-wrapper">
  <div id="toDoApp">
    <header>
      <span class="title">My todo list</span>
      <span class="count" v-bind:class="{zero: unsolvedTodos.length === 0}">{{unsolvedTodos.length}}</span>
    </header>
    <ul class="todo-list" v-if="dataIsLoaded">
      <li v-for="todo in todos.slice().reverse()" v-bind:class="{done: todo.completed}" :id="todo.id">
        <input type="checkbox" :checked="todo.completed" @change="toggleTodo(todo)" />
        <span class="title">{{todo.title}}</span>
        <button @click="deleteTodo(todo.id)">
          <i class="fa fa-trash" aria-hidden="true"></i>
        </button>
      </li>
    </ul>
    <div class="loader" v-else></div>
    <footer>
      <form @submit.prevent="addTodo()">
        <input type="text" placeholder="Add new todo..." v-model="newTitle">
        <span class="error" v-if="!isValidInput">Please add at least 3 characters</span>
      </form>
    </footer>
  </div>
</div>

关注点:

  1. 这个应用程序“挤满”了代码吗?换句话说,它是否可以用更少的代码来编写呢?
  2. 体系结构容易理解吗?
  3. 除了Axios,还有更好的选择吗?
EN

回答 1

Code Review用户

回答已采纳

发布于 2021-05-18 09:47:33

你是以一种非常程序化的方式做事情的,比如你如何改变TODO-项目,然后计算未解决的TODOs的数量。在使用Vue时,有一种更好的方法,即使用计算性质

代码语言:javascript
运行
AI代码解释
复制
methods: {
     toggleTodo: function(todo) {
         todo.completed = !todo.completed;
     },
     deleteTodo: function(id) {
         this.todos = this.todos.filter(todo => todo.id !== id);
     },
},
computed: {
    unsolvedTodos: function() {
        return this.todos.filter(todo => !todo.completed);
    },
    validInput: function() {
        return this.newTitle.length >= 3;
    }
},

体系结构容易理解吗?

是的,但这并不是最理想的,因为我上面提到过。

除了Axios,还有更好的选择吗?

不,在我看来不是。坚持Axios。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/260898

复制
相关文章
如何在 PowerBI 中设置数值标签的动态颜色
PowerBI 的数值标签从 2022 年 8 月开始支持动态颜色了。 首先,需要下载最新版的 Power BI Desktop。 渐变色方式 效果如下: 在【视觉对象】【数据标签】【值】【颜色】下设置即可。如下: 动态标记最大值与最小值 还可以用度量值进行设置,例如标记最大值与最小值。度量值如下: View.Color = 注意 这里的 DAX 用到的《BI 真经》视图型计算方法,不再重复。 这样就可以通过度量值,动态标记颜色,如下: 扩展创意用法 太多标签比较乱,可以仅仅显示需要的标签。创建
BI佐罗
2022/12/18
17.8K0
如何在 PowerBI 中设置数值标签的动态颜色
React动态添加标签组件
在前端开发的过程中,一些表单的输入经常需要输入多个内容,如果采用一个输入框+逗号分隔的方式,展示起来不是很清晰,一般需要采用标签的方式
zx钟
2023/09/12
5140
React动态添加标签组件
Emlog自动为文章标签添加该标签的链接
我们在编写文章时,经常需要添加一些标签的链接,这样不仅可以优化我们的内链,对用户来说也可以参照相关的文章,如果对文章的关键字进行手动添加链接,那样对我们来说太麻烦了,而且在标签关键词很多的情况下我们是记不住的,那怎么如何让Emlog站点的文章自动添加标签链接变为内链呢?其实我们只需要在主题目录下的module.php文件中添加一段代码就可以实现了。 打开我们主题的module.php文件添加如下代码: //自动为文章标签添加该标签的链接 function tag_link($content){
Youngxj
2018/06/07
1.2K0
EasyUI 动态添加标签页(Tabs)
我们使用 'exists' 方法来判断 tab 是否已经存在,如果已存在则激活 tab。如果不存在则调用 'add' 方法来添加一个新的 tab 面板
故久
2019/09/29
1.4K0
自动添加标签(2):再次实现
你从初次实验中学到了什么呢?为了提高可扩展性,需提高程序的模块化程度(将功能放在独立的组件中)。要提高模块化程度,方法之一是采用面向对象设计。你需要找出一些抽象,让程序在变得复杂时也易于管理。下面先来列举一些潜在的组件。
不可言诉的深渊
2019/07/26
1.7K0
自动为WordPress文章添加标签
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
小狐狸说事
2022/11/21
4460
自动为WordPress文章添加标签
自动添加标签(1):初次实现
今天介绍如何使用Python杰出的文本处理功能,包括使用正则表达式将纯文本文件转换为用HTML和XML等语言标记的文件。如果不熟悉这些语言的人编写了一些文本,而你要在系统中使用并对其内容进行标记,就必需具备这些技能。
不可言诉的深渊
2019/07/26
1.5K0
微伴助手如何增加客户积分?如何自动给客户添加企业标签?
微伴助手是一款企业微信第三方应用,已经为电商、教育、金融、保险、医疗等机构提供技术支持,适用于引流获客、客户意向跟进、销售转化、社群运营等全方位营销场景,旨在帮助企业构建高转化率的私域流量池。
阿那个沫
2023/05/29
5810
微伴助手如何增加客户积分?如何自动给客户添加企业标签?
使table背景颜色交替变换
<!--使table背景颜色交替变换--> <script> var table1 = document.getElementById("tbname"); var rows = table1.getElementsByTagName("tr"); for(var i=0;i<rows.length;i++){ if(i%2==0){ rows[i].style.backgroundColor='red'; }else{ rows[i].style.backgroundCo
闵开慧
2018/03/30
1.1K0
使括号有效的最少添加
给定一个由(和)括号组成的字符串S,我们需要添加最少的括号(或是),可以在任何位置,以使得到的括号字符串有效。 从形式上讲,只有满足下面几点之一,括号字符串才是有效的:
WindRunnerMax
2020/09/01
4230
ZBLOG PHP自动添加图片ALT标签的实现方法
默认情况下,ZBLOG PHP 上传的图片ALT标签是图片名称。网友有提到是不是可以不要每次手工修改,能够直接变成标题的ALT标签。于是老蒋找找网上有没有解决办法,对于WordPress的ALT标签是可以通过插件或者无插件代码实现的(这里方法),对于ZBLOG PHP程序应该也是可以实现。
老蒋
2021/12/27
5420
为WordPress 文章中的链接自动添加 nofollow标签
nofollow 标签是神马东东在这里不多说,请自行谷歌。默认的话,WordPress是不会为你的文章的链接添加rel="nofollow"的。如果你需要这么做的话,不必一个个手动添加,直接在主题的funtions .php文件那里加入以下代码就可以自动实现了。 add_filter('the_content', 'auto_nofollow'); function auto_nofollow($content) { //return stripslashes(wp_rel_nofollow($conten
Jeff
2018/01/19
1.5K0
如何给标签设置动态日期
我们在购买商品时,会发现商品的外包装上都会贴有标签,这些产品标签上会有名称、生成厂商、成分、条形码等信息。当然还有生成日期,尤其是食品类的商品,外包装上肯定会有生产日期,有的甚至精确到秒。这个日期是一个可变数据,会随着系统时间的变化而变化,小编下面就为大家介绍如何给标签设置动态日期。
神奇像素科技
2021/11/30
2.1K0
如何给标签设置动态日期
如何实现动态添加的元素添加点击事件
在页面开发过程中常常遇到需要动态添加元素,然后给这一元素绑定相关事件的情况,这种情况下一般需要给元素加上相关属性,然后写这些元素的事件函数即可。动态添加的元素怎么绑定事件呢?
前端老道
2022/03/29
4.1K0
activiti5使用教程1-添加动态标签
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162667.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/13
6940
activiti5使用教程1-添加动态标签
JavaScript自动添加标签UTF-8编码
JavaScript自动添加UTF-8编码,自动查询 head 是否有 UTF-8 的 meta,没有的话自动添加 当然这个也可以扩展成其他功能,会用JavaScript创建一个标签
xlj
2021/07/14
3120
原生js怎么为动态生成的标签添加各种事件
这几天用zepto.js写了不少事件,突然想到一个问题,那就是原生的js如何给动态生成的标签添加事件?因为这些标签都是后来通过ajax或者运行其他点击事件生成的,那么如果之前给他们写事件他们这个dom对象是找不到的,jq通过事件委托解决了这个问题,但是原生js这个问题该怎么解决呢?我在网上查了很多资料,好像只有一种办法,那就是在生成标签并把标签添加到html结构中后再添加对于这个新标签的各种事件,如果有更好的方法,欢迎提出来。 <!DOCTYPE html> <html lang="en"> <head>
吴裕超
2018/02/28
8.1K0
JavaScript自动添加标签UTF-8编码
JavaScript自动添加UTF-8编码,自动查询 head 是否有 UTF-8 的 meta,没有的话自动添加
xlj
2021/06/28
4310
点击加载更多

相似问题

为Chart.js动态添加颜色

338

Chart.js标签颜色

31

Chart.js改变标签颜色

29

如何更改chart.js轴标签的颜色?

252

Chart.js如何编辑标题标签颜色

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档