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 相关文章推荐
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
Jan 24 Javascript
浅析jquery的js图表组件highcharts
Mar 06 Javascript
js 触发select onchange事件代码
Mar 20 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
May 09 Javascript
基于React实现表单数据的添加和删除详解
Mar 14 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
简单的vuex 的使用案例笔记
Apr 13 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
Sep 25 Javascript
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
使用Apache的rewrite
2021/03/09 Servers
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
Python File readlines() 使用方法
2018/03/19 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
认购协议书范本
2014/04/22 职场文书
质量负责人任命书
2014/06/06 职场文书
网吧温馨提示
2015/07/17 职场文书
详解Django的MVT设计模式
2021/04/29 Python
Golang: 内建容器的用法
2021/05/05 Golang
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python