vue-父子组件和ref实例详解


Posted in Javascript onNovember 10, 2019

父组件向子组件传值

<div id="app">
  <!-- 父组件,可以在引用子组件的时候, 通过 属性绑定(v-bind:) 的形式, 把 需要传递给 子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用 -->
  <com1 v-bind:parentmsg="msg"></com1>
 </div>
// 创建 Vue 实例,得到 ViewModel
  var vm = new Vue({
   el: '#app',
   data: {
    msg: '123 啊-父组件中的数据'
   },
   methods: {},
   components: {
    // 结论:经过演示,发现,子组件中,默认无法访问到 父组件中的 data 上的数据 和 methods 中的方法
    com1: {
     data() { // 注意: 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上;
      // data 上的数据,都是可读可写的;
      return {
       title: '123',
       content: 'qqq'
      }
     },
     template: '<h1 @click="change">这是子组件 --- {{ parentmsg }}</h1>',
     // 注意: 组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
     // props 中的数据,都是只读的,无法重新赋值
     props: ['parentmsg'], // 把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据,只读,写的话会报警告
     directives: {},
     filters: {},
     components: {},
     methods: {
      change() {
       this.parentmsg = '被修改了'
      }
     }
    }
   }
  });

父组件向子组件传方法

<div id="app">
  <!-- 父组件向子组件 传递 方法,使用的是 事件绑定机制; v-on, 当我们自定义了 一个 事件属性之后,那么,子组件就能够,通过某些方式,来调用 传递进去的 这个 方法了 -->
  <com2 @func="show"></com2>
 </div>
 <template id="tmpl">
  <div>
   <h1>这是 子组件</h1>
   <input type="button" value="这是子组件中的按钮 - 点击它,触发 父组件传递过来的 func 方法" @click="myclick">
  </div>
 </template>
 // 定义了一个字面量类型的 组件模板对象
  var com2 = {
   template: '#tmpl', // 通过指定了一个 Id, 表示 说,要去加载 这个指定Id的 template 元素中的内容,当作 组件的HTML结构
   data() {
    return {
     sonmsg: { name: '小头儿子', age: 6 }
    }
   },
   methods: {
    myclick() {
     // 当点击子组件的按钮的时候,如何 拿到 父组件传递过来的 func 方法,并调用这个方法???
     // emit 英文原意: 是触发,调用、发射的意思
     // this.$emit('func123', 123, 456)
     this.$emit('func', this.sonmsg)
    }
   }
  }
  // 创建 Vue 实例,得到 ViewModel
  var vm = new Vue({
   el: '#app',
   data: {
    datamsgFormSon: null
   },
   methods: {
    show(data) {
     // console.log('调用了父组件身上的 show 方法: --- ' + data)
     console.log(data);
     this.datamsgFormSon = data
    }
   },
   components: {
    com2
    // com2: com2
   }
  });

vue+本地存储实现评论功能

难道在于理解父组件向子组件传方法

<div id="app">
  <cmt-box @func="loadComments"></cmt-box>
  <ul class="list-group">
   <li class="list-group-item" v-for="item in list" :key="item.id">
    <span class="badge">评论人: {{ item.user }}</span>
    {{ item.content }}
   </li>
  </ul>
 </div>
 <template id="tmpl">
  <div>
   <div class="form-group">
    <label>评论人:</label>
    <input type="text" class="form-control" v-model="user">
   </div>
   <div class="form-group">
    <label>评论内容:</label>
    <textarea class="form-control" v-model="content"></textarea>
   </div>
   <div class="form-group">
    <input type="button" value="发表评论" class="btn btn-primary" @click="postComment">
   </div>
  </div>
 </template>
var commentBox = {
   data() {
    return {
     user: '',
     content: ''
    }
   },
   template: '#tmpl',
   methods: {
    postComment() { // 发表评论的方法
     // 分析:发表评论的业务逻辑
     // 1. 评论数据存到哪里去???  存放到了 localStorage 中 localStorage.setItem('cmts', '')
     // 2. 先组织出一个最新的评论数据对象
     // 3. 想办法,把 第二步中,得到的评论对象,保存到 localStorage 中:
     // 3.1 localStorage 只支持存放字符串数据, 要先调用 JSON.stringify 
     // 3.2 在保存 最新的 评论数据之前,要先从 localStorage 获取到之前的评论数据(string), 转换为 一个 数组对象, 然后,把最新的评论, push 到这个数组
     // 3.3 如果获取到的 localStorage 中的 评论字符串,为空不存在, 则 可以 返回一个 '[]' 让 JSON.parse 去转换
     // 3.4 把 最新的 评论列表数组,再次调用 JSON.stringify 转为 数组字符串,然后调用 localStorage.setItem()
     var comment = { id: Date.now(), user: this.user, content: this.content }
     // 从 localStorage 中获取所有的评论
     var list = JSON.parse(localStorage.getItem('cmts') || '[]')
     list.unshift(comment)
     // 重新保存最新的 评论数据
     localStorage.setItem('cmts', JSON.stringify(list))
     this.user = this.content = ''
     // this.loadComments() // ?????
     this.$emit('func')
    }
   }
  }
  // 创建 Vue 实例,得到 ViewModel
  var vm = new Vue({
   el: '#app',
   data: {
    list: [
     { id: Date.now(), user: '李白', content: '天生我材必有用' },
     { id: Date.now(), user: '江小白', content: '劝君更尽一杯酒' },
     { id: Date.now(), user: '小马', content: '我姓马, 风吹草低见牛羊的马' }
    ]
   },
   beforeCreate(){ // 注意:这里不能调用 loadComments 方法,因为在执行这个钩子函数的时候,data 和 methods 都还没有被初始化好
   },
   created(){
    this.loadComments()
   },
   methods: {
    loadComments() { // 从本地的 localStorage 中,加载评论列表
     var list = JSON.parse(localStorage.getItem('cmts') || '[]')
     this.list = list
    }
   },
   components: {
    'cmt-box': commentBox
   }
  });

ref获取DOM和组件

vue中如何操作DOM

<div id="app">
  <input type="button" value="获取元素" @click="getElement" ref="mybtn">
  <h3 id="myh3" ref="myh3">哈哈哈, 今天天气太好了!!!</h3>
  <hr>
  <login ref="mylogin"></login>
 </div>
var login = {
   template: '<h1>登录组件</h1>',
   data() {
    return {
     msg: 'son msg'
    }
   },
   methods: {
    show() {
     console.log('调用了子组件的方法')
    }
   }
  }
  // 创建 Vue 实例,得到 ViewModel
  //vm中有一个属性叫ref
  var vm = new Vue({
   el: '#app',
   data: {},
   methods: {
    getElement() {
     // console.log(document.getElementById('myh3').innerText)
     // ref 是 英文单词 【reference】  值类型 和 引用类型 referenceError
     // console.log(this.$refs.myh3.innerText)
     console.log(this.$refs.mylogin.msg)
     this.$refs.mylogin.show()
    }
   },
   components: {
    login
   }
  });

总结

以上所述是小编给大家介绍的vue-父子组件和ref实例详解,希望对大家有所帮助!

Javascript 相关文章推荐
JavaScript-世界上误解最深的语言分析
Aug 12 Javascript
InnerHtml和InnerText的区别分析
Mar 13 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
Dec 30 Javascript
二叉树的非递归后序遍历算法实例详解
Feb 07 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
Jan 27 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
Nov 21 Javascript
实例解析Array和String方法
Dec 14 Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
详解JavaScript中的this指向问题
Feb 05 Javascript
vue $set 给数据赋值的实例
Nov 09 #Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 #Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
Nov 09 #Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
Nov 09 #Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
Nov 09 #Javascript
Vue实现点击按钮复制文本内容的例子
Nov 09 #Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
Nov 09 #Javascript
You might like
php防止SQL注入详解及防范
2013/11/12 PHP
PHP中的Memcache详解
2014/04/05 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php网页病毒清除类
2014/12/08 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python如何实现数据的线性拟合
2019/07/19 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
应届生新闻编辑求职信
2013/11/19 职场文书
装修致歉信
2014/01/15 职场文书
信息总监管理职责范本
2014/03/08 职场文书
给孩子的新年寄语
2014/04/08 职场文书
廉洁校园实施方案
2014/05/25 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
大学体育课感想
2015/08/10 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript