美文网首页
day04-vuejs-父&子组件之间的传值问题

day04-vuejs-父&子组件之间的传值问题

作者: 东邪_黄药师 | 来源:发表于2019-01-25 22:50 被阅读4次
父组件向子组件传值以及data和 props的区别:
image.png
结论:经过演示,发现,子组件中,默认无法访问到 父组件中的 data 上的数据 和 methods 中的方法

父组件,可以在引用子组件的时候, 通过 属性绑定(v-bind:) 的形式, 把 需要传递给 子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用

image.png
注意: 组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
props 中的数据,都是只读的,无法重新赋值
props: ['parentmsg']
把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据
image.png
注意: 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上;
区别:

data 上的数据,都是可读可写的;
把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据


子组件向父组件传值:

1. 原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去;
2. 父组件将方法的引用传递给子组件,其中,getMsg是父组件中methods中定义的方法名称,func是子组件调用传递过来方法时候的方法名称

 <son @func="getMsg"></son>

3.子组件内部通过this.$emit('方法名', 要传递的数据)方式,来调用父组件中的方法,同时把数据传递给父组件使用

  <div id="app">
<!-- 引用父组件 -->
<son @func="getMsg"></son>

<!-- 组件模板定义 -->
<script type="x-template" id="son">
  <div>
    <input type="button" value="向父组件传值" @click="sendMsg" />
  </div>
</script>
 </div>

  <script>
// 子组件的定义方式
Vue.component('son', {
  template: '#son', // 组件模板Id
  methods: {
    sendMsg() { // 按钮的点击事件
      this.$emit('func', 'OK'); // 调用父组件传递过来的方法,同时把数据传递出去
    }
  }
});

// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
  el: '#app',
  data: {},
  methods: {
    getMsg(val){ // 子组件中,通过 this.$emit() 实际调用的方法,在此进行定义
      alert(val);
    }
  }
});
 </script>

组件案例-评论列表:

分析:发表评论的业务逻辑
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()

 <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>

  <script>

    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
      }
    });
  </script>

this.$refs` 来获取DOM元素和组件:

 <div id="app">
    <input type="button" value="获取元素" @click="getElement" ref="mybtn">
 
    <h3 id="myh3" ref="myh3">哈哈哈, 今天天气太好了!!!</h3>

    <hr>

    <login ref="mylogin"></login>
  </div>

  <script>

    var login = {
      template: '<h1>登录组件</h1>',
      data() {
        return {
          msg: 'son msg'
        }
      },
      methods: {
        show() {
          console.log('调用了子组件的方法')
        }
      }
    }

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {
        getElement() {
          console.log(document.getElementById('myh3').innerText)

          // ref  是 英文单词 【reference】  
          console.log(this.$refs.myh3.innerText)

          console.log(this.$refs.mylogin.msg)
          this.$refs.mylogin.show()
        }
      },
      components: {
        login
      }
    });
  </script>
image.png

相关文章

  • 组件之间的传值

    组件之间的传值,包括父子组件传值,兄弟组件之间的传值,其中父子组件包括父组件向子组件传值和子组件向父组件传值,现在...

  • vue 组件之间传值方法

    1. 父组件向子组件传值 父组件: 子组件: 2. 子组件向父组件传值 子组件: 父组件: 3. 非父子之间传值 ...

  • 04vue2.0-Vue组件化-组件间的数据传递

    Vue组件之间传值 父组件向子组件传值 1.父组件向子组件传值 父组件发送的形式是以属性的形式绑定值到子组件身上。...

  • 2018-09-05

    组件传值问题 父组件给子组件传值应该使用props。子组件要给父组件传值,需要调用父组件传递的方法。props传值...

  • vue组件间传值问题总结

    vue项目中,组件间传值的问题总结: 父传子 父组件 子组件 上面父组件和子组件之间的传值是模拟接口请求数据,然后...

  • day04-vuejs-父&子组件之间的传值问题

    父组件向子组件传值以及data和 props的区别: 结论:经过演示,发现,子组件中,默认无法访问到 父组件中的 ...

  • Vue.js 父子组件传值 . 兄弟组件传值

    概述 vue中组件之间的传值传值情况主要有以下三种 父组件向子组件传值子组件向父组件传值兄弟组件之间相互传值或者是...

  • vue2.0小结

    父组件与子组件之间的通信 父组件传值给子组件,通过props 子组件传值给父组件,通过$emit 如果在父组件想在...

  • iView学习

    父组件向子组件传值 子组件向父组件传值 父组件向子组件传递数据双向绑定问题 注意:声明周期问题 data() 加载...

  • Vue_组件间传值

    1、父组件传值给子组件2、子组件传值给父组件 1、父组件传值给子组件 2、子组件传值给父组件

网友评论

      本文标题:day04-vuejs-父&子组件之间的传值问题

      本文链接:https://www.haomeiwen.com/subject/vuetjqtx.html