vue3常用组件通信

89 阅读1分钟

props 父组件传子组件,是一种简单的方式示例,关键api: defineProps,示例代码如下:

父组件代码如下:

  <Children :myprops="myTest"/>
   <div class="logo-container">
    <img src="@/assets/logo/huaJian.png" alt="">
   </div>
   <div class="bill-pannel">
   </div>
   <Rotation/>
</template>
<script setup  lang="ts">
import Children from '../components/children.vue'
import { ref } from 'vue';
const myTest = ref('myPropsText')

子组件代码如下:

  <div>children</div>
  <div>{{ props.myprops }}</div>
</template>
<script setup lang='ts'>
import { defineProps } from 'vue'
const props=defineProps(['myprops'])
</script>`

自定义事件(emit)通信方式,关键api:defineEmits,示例代码如下:

父组件代码:

  <Children  @emitsHanddler='handdler' />
  <div>{{ count }}</div>
</template>

<script setup  lang="ts">
import Children from '../components/children.vue'
import { ref } from 'vue';
const count = ref(2)

const handdler = (data) => {
  console.log('father',count)
     count.value+=1
 }
</script>

子组件代码如下:

  <div @click='handdler'>children</div>
</template>
<script setup lang='ts'>
import { defineEmits } from 'vue'
const emits = defineEmits(['emitsHanddler'])
const handdler = () => {
  console.log('children start');
  emits('emitsHanddler')
}
</script>

v-model 也是一种平常的方式,相当于自定义事件+props简写

父组件代码如下:

  <Children  v-model:title="title" />
</template>

<script setup  lang="ts">
import Children from '../components/children.vue'
import { ref } from 'vue';
const count = ref(2)
const title=ref('title')
const handdler = (data) => {
  console.log('father',count)
     count.value+=1
 }
</script>

子组件代码如下:

  <div @click='handdler'>children</div>
  <div>{{ props.title }}</div>
</template>
<script setup lang='ts'>
import { defineEmits ,defineProps } from 'vue'
const emits = defineEmits(['update:title'])
const props = defineProps (['title'])

const handdler = () => {
  console.log('children start');
  emits('update:title',96)
}
</script>

ref 需要注意的是ref变量命名必须要与子组件ref属性变量名一样,子组件需要导出方法(变量),示例代码如下:

父组件代码:

  <Children ref="myChildrenRef"/>
  <div>
   'father: ' {{  myChildrenRef?.childrenValue}}
  </div>
</template>

<script setup  lang="ts">
import Children from '../components/children.vue'
import { ref } from 'vue';
const myChildrenRef = ref(null)
const handdler = (data) => {
 }
</script>

子组件代码:

  <div @click='handdler'>children</div>
</template>
<script setup lang='ts'>
import { ref,defineExpose } from 'vue'
const childrenValue=ref('childrenValue')

const handdler = () => {
}
defineExpose({
  childrenValue
})
</script>

provideinject是Vue中提供的一对API,该API可以实现父组件向子组件传递数据,无论层级有多深,都可以通过这对API实现,有个缺点就是inject 下去的变量没有响应式 代码如下:

父组件:

  <Children/>
</template>

<script setup  lang="ts">
import Children from '../components/children.vue'
import { ref,provide } from 'vue';
const msg = ref('father')
provide('msg',msg.value)
const handdler = (data) => {
 }
</script>

子组件

  <div @click='handdler'>children</div>
  <div>children1: {{  fatherMsg }}</div>
</template>
<script setup lang='ts'>
import { inject } from 'vue'
const handdler = () => {
}
const fatherMsg=inject('msg')
</script>