vue传值

  • 父组件可以使用props把数据传给子组件
  • 子组件可以使用$emit,让父组件监听到自定义事件
<!-- 父组件 -->
<template>
    <div>
        <!-- v-on:test="..."(缩写为@test)  子组件方法 = 父组件方法 -->
        <argument ref="argument" :argumentId='..绑定的值..' :content='..绑定的值..' @test="loading"/>       
    </div>
</template>

<script>
import argument from '...'   // 引入

export default {
    name: '...',
    components: {
      ...       // 注册组件  
    },
    methods: {
        loading(val) {      // val为传过来的值
            ...             // 对val进行处理
        }
        test() {
            // 调用子组件方法
            this.$refs.父组件绑定的ref值.方法
        }
    }
}

</script>


<!-- 子组件 -->
<template>
    <div>
        
        
    </div>
</template>

<script>
export default {
    props: {                    
        // 父传子的方法
        'argumentId': Number,
        'content': String,
        'draft': Number,
        'getArgumentId': Function,
        'home': Object
    },
    
    data () {
        return {
            assignmentTest: ......
        }
    }
    
    methods: {
        load() {
            ...
            // 子传父
            // 对test进行注册('方法名',参数)
            this.$emit('test', this.assignmentTest)     
            ...
        }
    }
    
}
</script>

vue使用ref调用子组件方法,数据问题(看到了,记下笔记)

问题:在vue父子组件传值过程中,使用ref去调用子组件方法,没有在子组件中使用watch监听来调用调用子组件方法(使用watch就不会有这个问题)

// 父组件
<child :keyword='keyword' ref='child'></child>
<button @click='handlerChild'>调用子组件方法</button>
export default {
  data(){
    return(){
        keyword:''
    }
  },
  methods:{
    handlerChild(){
      this.$refs.child.getKeyWord()
    }
  } 
}
// 子组件
export default {
  props:{
    keyword:String
  },
  methods:{
    getKeyWord(){
      console.log(this.keyword)
    }
  } 
}

期望值:当父组件改变,子组件props接受,父组件调用子组件数据打印传递数据 结果:每次子组件打印都是上一次父组件传值过来的值???我也一时有点懵,难道props不是实时更新父组件传值过来的值吗?再利用watch监听以下keyword,没问题啊,监听每次都是显示父组件传值过来值,那么问题出在???

没错,问题出在了 this.$refs.child.getKeyWord()

vue官网找到:

ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例:

关于 ref 注册时间的重要说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!$refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定。

可能你还没有注意到,Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。 例如,当你设置 vm.someData = 'new value',该组件不会立即重新渲染。当刷新队列时,组件会在下一个事件循环“tick”中更新。多数情况我们不需要关心这个过程,但是如果你想基于更新后的 DOM 状态来做点什么,这就可能会有些棘手。虽然 Vue.js 通常鼓励开发人员使用“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们必须要这么做。为了在数据变化之后等待 Vue 完成更新 DOM,可以在数据变化之后立即使用 Vue.nextTick(callback)。这样回调函数将在 DOM 更新完成后被调用

如此我们只需要在调用子组件的方法时添加this.$nextTick(callback) 解决

// 父组件
<child :keyword='keyword' ref='child'></child>
<button @click='handlerChild'>调用子组件方法</button>
export default {
  data(){
    return(){
        keyword:''
    }
  },
  methods:{
    handlerChild(){
      this.$nextTick(() => {
          this.$refs.child.getKeyWord()
      })
    }
  } 
}