Vue从TodoList中学父子组件通信


Posted in Javascript onFebruary 05, 2019

简单的 TodoList

实现一个简单的 todolist,当我输入内容后,点击提交自动添加在下面,如下图所示:

Vue从TodoList中学父子组件通信

用代码实现这个效果:

<div id="app">
  <input type="text" v-model="inputVal">
  <button v-on:click="clickBtn">提交</button>
  <ul>
    <li v-for="item in list">{{item}}</li>
  </ul>
</div>
<script>
  let vm = new Vue({
    el:'#app',
    data:{
      list:[],
      inputVal:''
    },
    methods:{
      clickBtn(){
        this.list.push(this.inputVal)
        inputVal = ''
      }
    }
  })
</script>

当我在input框中输入内容后,点击提交,Vue 会自动将内容渲染在页面中,具体是怎么实现的呢?

我们都知道 Vue 是一个 MVVM 框架,让开发者专注于数据变更,无需关注 Dom,所以它的核心是VM层,也就是说渲染这部分不需要开发者考虑了。

循环v-for

v-for指令是 Vue 提供的api,可以实现循环添加

v-for="item in list"

将list中数据循环添加到页面中,值为item

所以当我点击提交时,只需要获取到输入框中的值,然后push到list中,我们看到的效果就是一个个添加。

绑定v-model

如何获取输入框中的值变成了一个问题,没用 Vue 之前,获取输入框中的值,非常简单,用$(input).val()就能轻松获取。

用了 Vue 之后,不应该操作 Dom 来获取值,Vue 肯定也考虑到这点了,提供了一个api

v-model="inputVal"

第一次用这个指令时,踩了一个坑,我在inputVal两边加上了双括号,从而导致页面中没任何反应,这边是不需要加双括号的。渲染模版时才需要用 Vue 提供的模版字符串

一个简单的 TodoList 就已经实现了。

组件化

每个li其实都是一个组件,我们可以用组件的形式来开发

全局组件:

<div id="app">
  <input type="text" v-model="inputVal">
  <button v-on:click="clickBtn">提交</button>
  <ul>
    <todo-list v-for="item in list"
          v-bind:content="index"
    ></todo-list>
  </ul>
</div>
<script>
  Vue.component('TodoLsit',{
    props:['content'],
    template:`<li>{{content}}</li>`,
  })
  let vm = new Vue({
    el: '#app',
    data: {
      list: [],
      inputVal: ''
    },
    methods: {
      clickBtn() {
        this.list.push(this.inputVal)
        this.inputVal = ''
      }
    }
  })
</script>

用 Vue 提供的component创建组件可创建一个全局组件,组件的名字TodoList在模版中需要用todo-list来实现,大小变小写,中间用-连接。

局部组件:

<button v-on:click="clickBtn">提交</button>
  <ul>
    <todo-list v-for="item in list"
         v-bind:content="item"
    ></todo-list>
  </ul>
</div>
<script>
  let TodoList = {
    props:['content'],
    template: `<li>{{content}}</li>`,
  }
  let vm = new Vue({
    el: '#app',
    data: {
      list: [],
      inputVal: ''
    },
    component:{   //注册组件
     TodoList 
    },
    methods: {
      clickBtn() {
        this.list.push(this.inputVal)
        this.inputVal = ''
      }
    }
  })
</script>

使用局部组件,声明一个对象,内容和全局组件一样,不过需要再 Vue 中注册一下,使用component属性注册

component:{
  TodoList
}

用了组件后之后,就会涉及到数据通信,一般有两种:

  • 组件中如何才能拿到外面的数据
  • 组件中数据变化,外面如何知道

父 -> 子组件通信

现在已经用组件实现上面的功能了,但是组件中还没有数据,如果将我输入框中的数据传递给子组件。

子组件中获取数据,还是用v-for循环,用v-bind绑定需要的数据,组件中用props获取绑定的数据

<todo-list v-for="(item,index) in list"
      v-bind:content="item"
      v-bind:index="index"
      v-on:delete="handleItemDelete"
></todo-list>

let TodoList = {
  props:['content'],
  template: `<li>{{content}}</li>`,      // content 就是相关数据
}

父 -> 子组件通信实现了往组件里面添加数据,如果子组件中要删除一项,应该怎么操作呢?

子 -> 父组件通信

子 -> 父组件通信,Vue 提供了一个$emit()方法,组件中使用v-on指令可绑定事件

<div id="app">
  <input type="text" v-model="inputVal">
  <button v-on:click="clickBtn">提交</button>
  <ul>
    <todo-list v-for="(item,index) in list"
         v-bind:item="item"
         v-bind:index="index"
         v-on:delete="handleItemDelete"
    ></todo-list>
  </ul>
</div>
<script>
  Vue.component('TodoList',{
   props:['item', 'index'],
   template: `<li v-on:click="handleItemClick">{{item}}</li>`,
   methods: {
     handleItemClick() {
       this.$emit('delete', this.index)
     }
   }
  })
  let vm = new Vue({
    el: '#app',
    data: {
      list: [],
      inputVal: ''
    },
    methods: {
      clickBtn() {
        this.list.push(this.inputVal)
        this.inputVal = ''
      },
      handleItemDelete(index) {
        this.list.splice(index, 1)
      }
    }
  })
</script>

组件中绑定事件,第一个参数是事件名,第二个参数是要传递给父元素的参数

template: '<li v-on:click="handleItemClick">{{item}}</li>'' //绑定事件为 click,需要执行的函数是 handleItemClick

methods: {                 //写在组件里面
  handleItemClick() {
    this.$emit('delete', this.index) 
  }
}

父元素监听事件

<todo-list v-for="(item,index) in list"
      v-bind:item="item"
      v-bind:index="index"
      v-on:delete="handleItemDelete"  //监听 delete 事件, 执行函数是 handleItemDelete
></todo-list>

handleItemDelete(index) {          //写在 Vue 实例中
  this.list.splice(index, 1)
}

通过父子组件之间的通信,就可以实现 父->子 子->父 之间数据传输问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript类和继承 constructor属性
Mar 04 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
Jun 01 Javascript
js下写一个事件队列操作函数
Jul 19 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
Jun 26 Javascript
用javascript为页面添加天气显示实现思路及代码
Dec 02 Javascript
jQuery与getJson结合的用法实例
Aug 07 Javascript
详解JavaScript对象和数组
Dec 03 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
Dec 24 Javascript
Angular中sweetalert弹框的基本使用教程
Jul 22 Javascript
vue-cli脚手架的安装教程图解
Sep 02 Javascript
js 实现碰撞检测的示例
Oct 28 Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 #Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 #Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 #Javascript
小程序页面动态配置实现方法
Feb 05 #Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
Feb 02 #Javascript
AngularJS实现的自定义过滤器简单示例
Feb 02 #Javascript
vue实现的树形结构加多选框示例
Feb 02 #Javascript
You might like
Smarty安装配置方法
2008/04/10 PHP
PHP 多进程 解决难题
2009/06/22 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
浅谈PHP中的
2016/04/23 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
python2.7到3.x迁移指南
2018/02/01 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
会计出纳岗位职责
2013/12/25 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang