HOME/Articles/

vue父组件调用子组件

Article Outline

vue父组件调用子组件

感觉被这个问题困扰了很久,在vue的项目中,通过router翻页后,codeMirror组件中的数据不会恢复初始化。

一度以为就要放弃了,在沉寂了好久之后,终于想到,在项目的codeMirror子组件中,有reset()方法,所以,如果能够在翻页时调用这个reset方法,就可以解决这个问题。

重新思考了这个问题,发现通过watch函数,可以实现监听页面路由的变化。因此,在路由变化时完成调用就可以。

一般子组件在父组件中被调用, 如果想要父组件调用子组件的方法,

(1)首先要通过ref 添加一个占位。

  <Exam ref="test" v-for="(list,index) in examInfo"
          :title="list.title"
          :question="list.question"
          :index="-1"
          :id="list.id"
          :customBh="list.customBh"
          :isProgramBlank="list.isProgramBlank"
          :src="list.src"
          :code-history="list.codeHistory"
          :score="list.score">
    </Exam>

这里把Exam子组件声明为ref。

(2)调用 通过this.$refs.test.reset() 即可完成对子组件中方法的调用。、

this.$ref.test ===>test是上述的ref中声明的占位名称。

.reset() 是Exam子组件中的方法。

 resetExamCode(){
          this.$nextTick(()=>{
            this.$refs.test[0].reset()
            console.log("it works")
          })
          },

本以为这样的调用就可以完成任务,但是还是想的太简单了。

(1)子组件中必须用<div></div>标签包裹。

这一点,很多文章中 都有提到

(2)如果父组件页面很复杂,需要考虑子组件方法的调用时机,在某些情况下,甚至会出现因为未渲染完成而导致子组件方法调用失败。

通过查询资料,发现vue中提供了对应的判断方法。

this.$nextTick()=>{} 方法,是vue回调函数,可以在页面加载完成后执行{}中的方法。

(3)以为有这两个就够了吗?nonono。因为项目中使用了v-for循环,所以,Exam组件其实是个组件数组。(虽然数组中只有一个元素)。但是还是要声明:this.$refs.test[0].xxxxx.