Vue2 与 Vue3:父子组件间的通信

227 阅读2分钟

本文将详细介绍Vue2和Vue3中父子组件通信的方法,包括参数传递、变量获取以及方法调用。

1. 父组件给子组件的传参

Vue2

在Vue2中,父组件通过props向子组件传递参数。例如:

<!-- 父组件 -->
<template>
  <child-component :message="parentMessage"></child-component>
</template>

<script>
export default {
  data() {
    return {
      parentMessage: 'Hello from parent'
    };
  }
}
</script>

<!-- 子组件 -->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: ['message']
}
</script>

Vue3

Vue3中,父组件向子组件传递参数的方式基本相同,但引入了setup,使得代码更加简洁:

<!-- 父组件 -->
<template>
  <child-component :message="parentMessage"></child-component>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const parentMessage = ref('Hello from parent');
    return { parentMessage };
  }
}
</script>

<!-- 子组件 -->
<template>
  <div>{{ message }}</div>
</template>

<script>
import { defineProps } from 'vue';

export default {
  props: ['message']
}
</script>

2. 子组件给父组件的传参

Vue2

在Vue2中,子组件通过$emit方法向父组件传递参数:

<!-- 子组件 -->
<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('messageFromChild', 'Hello from child');
    }
  }
}
</script>

<!-- 父组件 -->
<template>
  <child-component @messageFromChild="handleMessage"></child-component>
</template>

<script>
export default {
  methods: {
    handleMessage(message) {
      console.log(message); // 'Hello from child'
    }
  }
}
</script>

Vue3

Vue3中,子组件向父组件传递参数的方式与Vue2类似:

<!-- 子组件 -->
<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
import { defineEmits } from 'vue';

export default {
  setup() {
    const emit = defineEmits(['messageFromChild']);
    const sendMessage = () => {
      emit('messageFromChild', 'Hello from child');
    };
    return { sendMessage };
  }
}
</script>

<!-- 父组件 -->
<template>
  <child-component @messageFromChild="handleMessage"></child-component>
</template>

<script>
export default {
  setup() {
    const handleMessage = (message) => {
      console.log(message); // 'Hello from child'
    };
    return { handleMessage };
  }
}
</script>

3. 获取父子组件之间的变量

Vue2

在Vue2中,可以通过$parent$children访问父子组件的实例:

<!-- 父组件 -->
<template>
  <child-component ref="child"></child-component>
</template>

<script>
export default {
  mounted() {
    console.log(this.$refs.child.childMessage); // 'Message from child'
  }
}
</script>

<!-- 子组件 -->
<template>
  <div>{{ childMessage }}</div>
</template>

<script>
export default {
  data() {
    return {
      childMessage: 'Message from child'
    };
  }
}
</script>

Vue3

Vue3中,可以通过provideinject来实现跨组件的变量传递:

<!-- 父组件 -->
<template>
  <child-component></child-component>
</template>

<script>
import { provide } from 'vue';

export default {
  setup() {
    provide('parentMessage', 'Message from parent');
  }
}
</script>

<!-- 子组件 -->
<template>
  <div>{{ parentMessage }}</div>
</template>

<script>
import { inject } from 'vue';

export default {
  setup() {
    const parentMessage = inject('parentMessage');
    return { parentMessage };
  }
}
</script>

4. 父组件与子组件的方法相互调用

Vue2

在Vue2中,可以通过$refs来调用子组件的方法,子组件也可以通过$parent调用父组件的方法:

<!-- 父组件 -->
<template>
  <child-component ref="child"></child-component>
</template>

<script>
export default {
  methods: {
    callChildMethod() {
      this.$refs.child.childMethod();
    }
  }
}
</script>

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

<script>
export default {
  methods: {
    childMethod() {
      console.log('Child method called');
    }
  }
}
</script>

Vue3

Vue3中,同样可以通过refdefineExpose来实现方法的相互调用:

<!-- 父组件 -->
<template>
  <child-component ref="child"></child-component>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const child = ref(null);
    const callChildMethod = () => {
      child.value.childMethod();
    };
    return { child, callChildMethod };
  }
}
</script>

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

<script>
import { defineExpose } from 'vue';

export default {
  setup() {
    const childMethod = () => {
      console.log('Child method called');
    };
    defineExpose({ childMethod });
  }
}
</script>

通过以上对比,我们可以看到 Vue3 在父子组件通信方面提供了更多的灵活性和简洁性。希望本文能帮助你更好地应用 Vue2 和 Vue3 中父子组件的通信。