Vue3父子之间通信(上)

文章介绍了Vue框架中,如何在父组件(index.vue)通过props向子组件(Left.vue和Right.vue)传递数据,以及子组件如何通过emit和defineEmits向父组件发送自定义事件。展示了`v-bind`、`defineProps`和`defineEmits`的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


父组件的代码:index.Vue 

<template>
    <div class="info">
        <div class="info-left">
           <Left
             :contentList="contentList"
             :total="total"
             :page="page"
             :size="size"
             @changePages="changePages"
             @changeSize="changeSize"
           ></Left>
         </div>
         <div class="info-right">
           <Right :hotList="hotList"></Right>
         </div>
       </div>
     </div>
 </template>
 <script lang='ts' setup>
     import Left from './Left.vue'
    import Right from './Right.vue'
    const contentList = ref<any[]>([])
    const hotList = ref<any[]>([])
    
    const total = ref(0)
    const size = 5
    const page = ref<any>(1)
    
    const changePages = (pages:any) => {
      page.value = pages
      load("")
    }
    const load = async(type:any){
        let getList = await getTecher({
          page: page.value,
          pageSize: size,
          articleType: 'Li'
        })
        contentList.value = getList .list
        total.value = getList .total
    }
    const getHotList = async (moudleName: string) => {
      let hot = await getHot(4)
      hotList.value = hot
    }
 </script>



子组件  Left.vue

<template>
     <div class="pagination">
        <n-pagination
          v-model="props.page"
          :item-count="total"
          show-quick-jumper
          style="justify-content: center"
          :on-update:page="showPageChange"
        />
      </div>
</template>
<script lang = 'ts' setup>
    import { defineProps,defineEmits } from 'vue'
    const props = defineProps({
      contentList: Array,
      total: Number,
      page: Number,
      size: Number
    })
    // 计算总页数
    const emits = defineEmits(['changePages'])
    const showPageChange = (page: number) => {
      emits('changePages', page)
    }
</script>


子组件  Right.vue

<template>
    <div>
          <span v-if="hotList.length <= 0">暂无数据</span>
          <ul v-else class="keynote">
            <li
              v-for="(item, index) in hotList"
              :key="index"
              class="keys"
              @click="handleOpenDetail(item)"
            >
              <p class="note">{{ item.title }}</p>
              <p class="k_date">{{ item.createTime.slice(5, 10) }}</p>
            </li>
          </ul>
    </div>
</template>
<script lang= 'ts' setup>
    import { defineProps } from 'vue'
    const props = defineProps({
       hotList: Array
    })
</script>


一、父传子 defineProps


父组件index.vue中在调用子组件Left.vueRight.vue时,使用v-bind绑定参数contentList,total,page,size以及hotList,在子组件Left.vue中,就使用了defineProps接受那些参数,可以试着打印props,结果如下:

console.log(props,73737373);
console.log(props.contentList);
console.log(props.total);
console.log(props.page);
console.log(props.size);



之后就可以正常使用该参数了


二、子传父defineEmits


        子组件传值给父组件主要是子组件通过defineEmits注册一个自定义事件,而后触发emit去调用该自定义事件,并产地参数给父组件。
在父组件中调用子组件时,通过v-on绑定一个函数,通过该函数获取传过来的值。
看上边的父组件index.vue中调用Left.vue这个子组件时,当子组件Left.vue需要传参给父组件index.vue时,使用defineEmits注册一个事件changePages,而后设置点击事件showPageChange去触发emit,去调用我们注册的自定义事件changePages,并传递page参数至父组件。

父组件index.vue在获取子组件Left.vue传过来的值时,通过在子组件上使用v-on设置响应函数changePages (该函数与子组件中的注册自定义事件changePages名称需一致)

### Vue3父子组件通过 `defineProps` 进行通信Vue3 的组合式 API 中,`defineProps` 是一种用于定义子组件接收父组件传递数据的方法。它允许开发者声明 props 并指定其类型和其他约束条件[^2]。 #### 父组件向子组件传值示例 以下是父组件向子组件传递数据的具体实现: ##### 父组件代码 ```vue <template> <div> <h1>父组件</h1> <ChildComponent :message="parentMessage" /> </div> </template> <script setup> import ChildComponent from &#39;./ChildComponent.vue&#39;; const parentMessage = &#39;这是来自父组件的消息&#39;; </script> ``` 在此代码中,父组件通过属性绑定的方式 (`:message`) 将变量 `parentMessage` 的值传递给子组件[^1]。 ##### 子组件代码 ```vue <template> <div> <p>{{ message }}</p> </div> </template> <script setup> // 定义 Props 接收父组件的数据 const props = defineProps({ message: { type: String, required: true, // 表明此 prop 是必需的 } }); </script> ``` 在这个例子中,子组件使用了 `defineProps` 方法来声明一个名为 `message` 的 prop,并指定了它的类型为字符串以及它是必需的。 --- ### 关键点解析 - **`defineProps` 的作用** `defineProps` 是 Vue3 提供的一个宏,在 `<script setup>` 中无需导入即可直接使用。它可以用来定义子组件接收到的 props 数据结构及其验证规则。 - **Prop 验证规则** 开发者可以通过对象形式为每个 prop 设置详细的验证规则,例如类型、默认值和是否必填等。 --- ### 总结 通过上述方式,可以轻松实现父组件向子组件传递数据的功能。父组件只需将所需数据作为属性绑定到子组件上,而子组件则利用 `defineProps` 来接收并处理这些数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值