Vue 组件封装,实现TodoList

博客主要讲述封装Todolist和其中Title部分,以实现复用,还提及了相关文件main.js、Todolist.vue和Title.Vue。

封装Todolist和里面的Title部分,便于复用。

main.js

import Vue from 'vue'
import Todolist from './components/Todolist'
Vue.config.productionTip = false

new Vue({
  /* 找到id为app的容器,组件选择器 */
  el: '#app',
  components: {
    Todolist
  },
  template: '<Todolist/>'
})

Todolist.vue

<template>
  <div>
    <!--变量渲染-->
    <!--<p>{{title}}</p>-->
    <!--条件渲染true显示,false不显示-->
    <!--<p v-if="showSub">{{subTitle}}</p>-->
    <!--TODO:组件封装,属性传递前面要使用冒号,声明这是一个变量 -->
    <Title :title="title" :subtitle="subtitle"></Title>
    <div>
      <!--响应按Enter键加入事件-->
      <input @keyup.enter="handleClick" type="text" v-model="mytodo">
      <!--处理点击事件【添加】-->
      <button @click="handleClick">添加</button>
      <button @click="reset">清空已完成</button>
    </div>
    <!-- v-for循环列表显示-->
    <ul>
      <!--根据done的值,设置class的值-->
      <li :class="{'done':todo.done}" @click='toggle(index)'
          v-for='(todo, index) in todos'>{{index+1}}: {{todo.text}}</li>
    </ul>
    <p>{{remain}}/{{todos.length}}</p>
  </div>
</template>

<script>
import Title from './Title'
/* 暴露组件:组件内部的data,必须是个函数,防止多个组件之间变量的共享 */
export default {
  /* 组件可以使用别的组件,比如Title */
  components: {
    Title
  },
  data () {
    return {
      title: 'Vue Todo List',
      subtitle: 'VUE Base 1745',
      showSub: false,
      mytodo: '',
      todos: [
        {text: '吃饭', done: false},
        {text: '睡觉', done: true},
        {text: '打豆豆', done: false}
      ]
    }
  },
  // 新定义一个字段 remain,剩余未完成的事项。
  computed: {
    remain () {
      return this.todos.filter(v => !v.done).length
    }
  },
  methods: {
    // 点击添加事件响应(添加元素,清空输入框)
    handleClick () {
      this.todos.push({text: this.mytodo, done: false})
      this.mytodo = ''
      // this.reset()
    },
    toggle (i) {
      // 切换状态
      this.todos[i].done = !this.todos[i].done
    },
    reset () {
      // 已完成的过滤掉
      this.todos = this.todos.filter(v => !v.done)
    }
  }
}
</script>
<style>
  li.done{
    text-decoration: line-through;
    color:red;
    font-weight: bold;
    text-shadow: 1px 0px 0px yellow;
  }
</style>

Title.Vue

<template>
  <div class='title'>
    <!--变量渲染-->
    <p>{{title}}</p>
    <p >{{subtitle}}</p>
  </div>
</template>

<script>
export default {
  /* 对外暴露对象 */
  props: ['title', 'subtitle']
}
</script>
<style >
.title p{
  color:red;
}
</style>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值