vue父子组件之间的传值方法

父子组件通信:
!三要素 *
props
slot
$emit

event
attribute
native修饰符
$listeners
v-model、sync修饰符
parent和parent和parentchildren
ref

跨组件通信
provide和Inject
router
vuex
eventbus


prop
由父组件传递到子组件。

event
由子组件通知到父组件。

attribute
子组件没有声明的属性,父组件多传递的属性会附着在子组件根元素上,通过attrs获取。子组件可以通过inheritAttes:false,就不会附着在根元素上,但不会影响attrs获取。 子组件可以通过inheritAttes:false,就不会附着在根元素上,但不会影响attrsinheritAttesfalse,attrs。

native修饰符
将事件直接附着在子组件根元素上。

**listeners∗∗子组件可以通过listeners** 子组件可以通过listenerslisteners获取父组件传递的所有事件处理函数。

v-model、sync修饰符
v-model实现双向数据绑定。

sync修饰符作用与v-model类似,弥补v-model只针对一个数据进行实现数据绑定的缺陷。在Vue3中被移除。

parent和parent和parentchildren
获取当前组件的父组件和子组件的实例

slots和slots和slotsscopedSlots
通过插槽传递数据。

ref
父组件中得到子组件实例。

跨组件通信

provide和Inject
父组件通过provide提供数据,后代组件提供inject声明用到的数据。

router
组件改变了地址栏,其他组件就可以监听地址栏的变化做出相应的操作。

vuex
数据仓库

eventbus
组件通知事件总线某件事,事件总线会通知监听该事件的所有组件。


实际案列如下:

父传子
父组件对子组件传递参数,子组件需要用到props来接收参数。

一般使用:以字符串的形式列出prop,或者指定prop类型

props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
// OR
props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object,
  callback: Function,
  contactsPromise: Promise // or any other constructor
}

但是通常在项目开发中,我们需要对组件的prop进行验证。通常你知道这些prop的类型,只要有一个验证需求没有被满足,就会报错。在团队开发中,这很重要。

  props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      //对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }
''''

注意那些 prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data、computed 等)default 或 validator 函数中是不可用的。


1、父子组件间数据的传递
(1)父组件给子组件传递数据通过props进行声明**

父组件

//父组件<template>

  <div>
    <el-button @click="click">点击调用子组件中的函数</el-button>
    <Son ref="son" :fatherData='outputVal'/>//绑定需要传递的数据
  </div>
</template>

<script>
import Son from "./son";
export default {
  name: "father",
  data() {
    return {
      outputVal:'这是父组件传递给子组件的数据' //增加代码
    };
  },
  components:{
    Son
  },
  methods: {
    click() {
      this.$refs.son.textShow();
    }
  }
};
</script>

<style>
</style>


**子组件**
//子组件<template>
  <div>
    <p v-if="!!show">我的方法被父组件调用了</p>
    <p>{{fatherData}}</p>//输出父组件传过来的数据
  </div>
</template>

<script>
export default {
  name:'Son',
  data(){
    return{
      show:false
    }
  },
  props:{ //使用props声明要接收的值
    fatherData:{    type:String ,//定义接收数据的类型若类型不符合将会在控制台输出错误    default:''//定义默认值,当父组件没有传递数据时,会使用默认值  }
  },
  methods:{
    textShow(){
      this.show=!this.show
    }
  }
}
</script>

<style>

</style>





**2)、*子组件向父组件传递数据
$emit的理解:当我们点击按钮,子组件便会分发一个名为output的事件,父组件中使用函数接收该事件传递的数据。**

**父组件**

<template>
  <div>
    <p>{{initVal}}</p>
    <Son ref="son" :fatherData='outputVal' @ouput='getSonVal'/>
  </div>
</template>

<script>
import Son from "./son";
export default {
  name: "father",
  data() {
    return {
      initVal:'这是父组件自身的值'
    };
  },
  components:{
    Son
  },
  methods: {
    getSonVal(val){
      this.initVal=val
    }
  }
};
</script>

<style>
</style>

**子组件**

<template>
  <div>
    <el-button @click="ouputToFather">子组件中的按钮</el-button>
  </div>
</template>

<script>
export default {
  name: "Son",
  data() {
    return {
      outSonVal:'我是子组件传递给父组件的数据'
    };
  },
  methods: {
    ouputToFather(){
      this.$emit('ouput',this.outSonVal)//分发名为output的事件,将outSonVal的值发送出去
    }
  }
};
</script>

<style>
</style>
Vue项目中,父子组件之间有多种方法可以实现。其中一种常用的方法是使用props和$emit。 首先,在组件中,可以通过props属性将数据递给子组件。在子组件中,通过props选项接收组件递的数据。例如,在组件中定义一个子组件,并通过props属性递一个名为"name"的数据给子组件: ```html <Child :name="小张"></Child> ``` 在子组件中,通过props选项接收组件递的数据: ```javascript props: \["name"\] ``` 另一种方法是使用$emit来自定义事件,在子组件中触发该事件并递数据给组件。在组件中,通过监听子组件触发的事件来获取子组件递的数据。例如,在子组件中触发一个名为"increment"的自定义事件,并递数据"我是子组件"给组件: ```javascript this.$emit("increment", "我是子组件") ``` 在组件中,通过监听子组件触发的事件来获取子组件递的数据: ```html <Child @increment="f1"></Child> ``` ```javascript methods: { f1(data) { console.log(data) // 打印"我是子组件" } } ``` 这样,组件就可以接收到子组件递的数据了。 除了props和$emit,还有其他方法可以实现父子组件之间,如使用$parent和$children来访问组件和子组件的实例,或者使用$ref来引用子组件。但是在实际开发中,props和$emit是最常用的方法。 #### 引用[.reference_title] - *1* *3* [vue父子组件方法](https://blog.csdn.net/YoungMan_09/article/details/123451827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Vue父子组件](https://blog.csdn.net/qq_49867247/article/details/123480614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值