欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vuejs 实现简易 todoList 功能 与 组件

程序员文章站 2022-07-02 21:22:00
todoList 结合之前 Vuejs 基础与语法 使用 v-model 双向绑定 input 输入内容与数据 data 使用 @click 和 methods 关联事件 使用 v-for 进行数据循环展示

todolist

结合之前 vuejs 基础与语法

  • 使用 v-model 双向绑定 input 输入内容与数据 data
  • 使用 @click 和 methods 关联事件
  • 使用 v-for 进行数据循环展示
Vuejs 实现简易 todoList 功能 与 组件
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>todolist</title>
  <script src="./vue.js"></script>
</head>
<body>
  <div id="root">
    <div>
      <input v-model="inputvalue"/>
      <button @click="handlesubmit">提交</button>
    </div>
    <ul>
      <li v-for="(item,index) of list" :key="index">
        {{item}}
      </li>
    </ul>
  </div>

  <script>
    new vue({
      el: "#root",
      data: {
        inputvalue: '',
        list: []
      },
      methods: {
        handlesubmit: function(){
          this.list.push(this.inputvalue)
          this.inputvalue = ''
        }
      }
    })
  </script>
</body>
</html>
view code

jsbin 预览

todolist 组件拆分

vuejs 组件相关 详细参考

全局组件

注册全局组件,并在 html 中通过模板调用组件

Vuejs 实现简易 todoList 功能 与 组件
    //注册全局组件
    vue.component('todo-item',{
      template: '<li>item</li>'
    })
    <ul>
      <!-- <li v-for="(item,index) of list" :key="index">
        {{item}}
      </li> -->
      <todo-item></todo-item>      <!-- 通过模板使用组件 -->
    </ul>
view code

jsbin 预览

局部组件

在注册了局部组件之后,直接通过模板调用是不可以的,必须要在最外层的 vue 的实例中添加 components: { }进行组件声明。

Vuejs 实现简易 todoList 功能 与 组件
    //注册局部组件
    var todoitem = {
      template: '<li>item</li>'
    }
    new vue({
      el: "#root",
      components: {   //局部组件需要声明的 components
        'todo-item': todoitem
      },
      data: {
        inputvalue: '',
        list: []
      },
      methods: {
        handlesubmit: function(){
          this.list.push(this.inputvalue)
          this.inputvalue = ''
        }
      }
    })
view code

jsbin 预览

即通过局部注册的组件,需要在其他的 vue 实例中使用该局部组件。必须使用 components 对该局部组件进行注册。
上面的实例中,要在 vue 实例中使用 todoitem 这个局部组件,就通过 todo-item 这个标签来使用。当在实例中 注册好了以后,才可以在模板里面使用这个标签。这样就算正确的使用了局部组件。

外部传递参数

给 todo-item 标签添加 :content 属性,值为循环的每一项的内容 "item"
这样就可以吧 content 传递给 todo-item 这个组件

<todo-item v-for="(item,index) of list" :key="index" :content="item"></todo-item> 

但是直接将组件改成是不行的

    vue.component('todo-item',{
      template: '<li>{{content}}</li>'
    })

需要让组件接收属性,所以要在todo-item组件里面定义props属性,其值为一个数组 'content' 。
其含义是,该组件接收从外部传递的进来的名字叫做 content 的属性

    vue.component('todo-item',{
      props: ['content'],
      template: '<li>{{content}}</li>'
    })

jsbin 预览

组件与实例的关系

vue 之中,每一个组件其实也是一个 vue 的实例。因此在 vue 项目中,是一个个实例构建而成的。
因此组件之中,也可以绑定 @click 事件,添加 methods 属性。

    vue.component('todo-item',{
      props: ['content'],
      template: '<li @click="handleclick">{{content}}</li>',
      methods: {
        handleclick: function(){
          alert('clicked')
        }
      }
    })

jsbin 预览


同样的实例也可以被称作一个组件,那么我们这个根实例当中的 template 模板是什么呢 ?
如果一个 vue 实例没有模板,会到挂载点去找。如下实例,根实例会找到 #root 下面挂载点的所有内容作为模板。

    new vue({
      el: "#root",
      data: {
        inputvalue: '',
        list: []
      },
      methods: {
        handlesubmit: function(){
          this.list.push(this.inputvalue)
          this.inputvalue = ''
        }
      }
    })

 

为 todolist 添加删除功能

通过 发布 / 订阅,当子组件点击时,通知父组件把数据删除掉。在子组件中,发布自定义一个 'delete' 事件。调用 this.$emit 方法,并传递 index 的值。

子组件向外部进行发布

    //子组件
    vue.component('todo-item',{
      props: ['content','index'],
      template: '<li @click="handleclick">{{content}}</li>',
      methods: {
        handleclick: function(){
          //发布
          this.$emit('delete', this.index)
        }
      }
    })

父组件在模板里创建子组件的时候,监听子组件向外触发的 delete 事件,如果监听到 delete 事件,执行 handledelete 函数。

      <todo-item v-for="(item,index) of list"
                 :key="index"
                 :content="item"
                 :index="index"
                 @delete="handledelete">  <!-- 监听delete事件 -->
      </todo-item>      <!-- 通过模板使用组件 -->

然后在父组件的 methods 中,写好 handledelete 方法。

    //最外层实例,父组件
    new vue({
      el: "#root",
      data: {
        inputvalue: '',
        list: []
      },
      methods: {
        handlesubmit: function(){
          this.list.push(this.inputvalue)
          this.inputvalue = ''
        },
        handledelete: function(index){
          this.list.splice(index,1)  //使用splice方法删除list
        }
      }
    })

jsbin 预览