35、子组件向父组件传值

博客介绍了子组件向父组件传值的方法。子组件使用`$emit()`触发事件,该方法第一个参数为自定义事件名称,第二个参数是要传递的数据;父组件则用v - on监听子组件的事件,并给出了传参例子。

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

子组件向父组件传值

- 子组件用`$emit()`触发事件
- `$emit()`  第一个参数为 自定义的事件名称     第二个参数为需要传递的数据
- 父组件用v-on 监听子组件的事件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div :style='{fontSize: fontSize + "px"}'>{{pmsg}}</div>
	
	<!-- 2 父组件用v-on 监听子组件的事件
	 	这里 enlarge-text  是从 $emit 中的第一个参数对应   handle 为对应的事件处理函数	 -->
	
    <menu-item :parr='parr' @enlarge-text='handle'></menu-item>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    /*
      子组件向父组件传值-基本用法
      props传递数据原则:单向数据流
    */
    
    Vue.component('menu-item', {
      props: ['parr'],
      template: `
        <div>
          <ul>
            <li :key='index' v-for='(item,index) in parr'>{{item}}</li>
          </ul>
		  /*  1、子组件用$emit()触发事件
			 第一个参数为 自定义的事件名称   第二个参数为需要传递的数据  */
          <button @click='$emit("enlarge-text")'>扩大父组件中字体大小</button>
        </div>
      `
    });
    var vm = new Vue({
      el: '#app',
      data: {
        pmsg: '父组件中内容',
        parr: ['apple','orange','banana'],
        fontSize: 10
      },
      methods: {
        handle: function(){
          // 扩大字体大小
          this.fontSize += 5;
        }
      }
    });
  </script>
</body>
</html>

传参例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div :style='{fontSize: fontSize + "px"}'>{{pmsg}}</div>
    <menu-item :parr='parr' @enlarge-text='handle($event)'></menu-item>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    /*
      子组件向父组件传值-携带参数
    */
    
    Vue.component('menu-item', {
      props: ['parr'],
      template: `
        <div>
          <ul>
            <li :key='index' v-for='(item,index) in parr'>{{item}}</li>
          </ul>
          <button @click='$emit("enlarge-text", 5)'>扩大父组件中字体大小</button>
          <button @click='$emit("enlarge-text", 10)'>扩大父组件中字体大小</button>
        </div>
      `
    });
    var vm = new Vue({
      el: '#app',
      data: {
        pmsg: '父组件中内容',
        parr: ['apple','orange','banana'],
        fontSize: 10
      },
      methods: {
        handle: function(val){
          // 扩大字体大小
          this.fontSize += val;
        }
      }
    });
  </script>
</body>
</html>

 

### UniApp 中子组件父组件的方法与示例 在 UniApp 开发中,子组件父组件传递数据是一种常见的需求。以下是几种常用方法及其具体实现: --- #### 方法一:通过 `$emit` 发送事件 这是最基础也是最常见的父子组件通信方式。子组件通过 `this.$emit` 触发自定义事件,并将数据作为参数传递父组件。 ##### 子组件 (`Child.vue`) ```vue <template> <view @tap="sendDataToParent"> 点击我向父组件 </view> </template> <script> export default { methods: { sendDataToParent() { const data = "来自子组件的数据"; this.$emit("customEvent", data); // 自定义事件名和要传递的数据 } } }; </script> ``` ##### 父组件 (`Parent.vue`) ```vue <template> <view> <text>接收到的数据:{{ receivedData }}</text> <child @customEvent="handleCustomEvent"></child> </view> </template> <script> import Child from "./Child.vue"; export default { components: { Child }, data() { return { receivedData: "" }; }, methods: { handleCustomEvent(data) { console.log("接收到子组件的数据:", data); this.receivedData = data; // 更新父组件的状态 } } }; </script> ``` 这种方法适用于简单的父子组件通信场景[^1]。 --- #### 方法二:使用 Props 和 Events 结合 对于需要同时接收父组件数据并反馈结果的情况,可以结合 `props` 和 `$emit` 使用。 ##### 父组件 (`Parent.vue`) ```vue <template> <view> <text>当前计数:{{ count }}</text> <child :initialCount="count" @updateCount="updateCountHandler"></child> </view> </template> <script> import Child from "./Child.vue"; export default { components: { Child }, data() { return { count: 0 }; }, methods: { updateCountHandler(newCount) { this.count = newCount; // 接收子组件更新的计数 } } }; </script> ``` ##### 子组件 (`Child.vue`) ```vue <template> <view> <button @click="incrementCount">增加计数</button> </view> </template> <script> export default { props: ["initialCount"], // 接收父组件传递的初始 data() { return { currentCount: this.initialCount || 0 }; }, methods: { incrementCount() { this.currentCount += 1; this.$emit("updateCount", this.currentCount); // 将新通知父组件 } } }; </script> ``` 这种组合方式适合需要双向绑定或复杂交互逻辑的场景[^2]。 --- #### 方法三:依赖注入(Provide/Inject) 当涉及到多层嵌套组件或者深层级通信时,可以考虑使用 Vue 的 `provide/inject` 特性。虽然它主要用于祖孙组件间的通信,但在某些情况下也可以简化父子组件之间的数据流动。 ##### 祖先组件 (`Grandparent.vue`) ```vue <template> <view> <text>{{ messageFromAncestor }}</text> <parent></parent> </view> </template> <script> import Parent from "./Parent.vue"; export default { components: { Parent }, provide() { return { setMessage: this.setMessage // 提供一个方法让后代组件调用 }; }, data() { return { messageFromAncestor: "默认消息" }; }, methods: { setMessage(newMessage) { this.messageFromAncestor = newMessage; // 修改祖先组件的状态 } } }; </script> ``` ##### 后代组件 (`Child.vue`) ```vue <template> <view> <button @click="sendMessageToAncestor">更改祖先组件的消息</button> </view> </template> <script> export default { inject: ["setMessage"], // 注入由祖先组件提供的方法 methods: { sendMessageToAncestor() { this.setMessage("新的消息来自子组件"); } } }; </script> ``` 尽管这不是典型的父子组件通信手段,但它扩展了解决问题的可能性[^4]。 --- ### 总结 UniApp 支持多种灵活的方式来实现子组件父组件的功能。无论是基本的 `$emit` 调用还是更高级别的 `provide/inject` 技术,开发者可以根据实际业务需求选择最适合的技术路径。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值