vue传值(父传子)和(子传父)

目录

1、父传子

2、子传父

①自定义事件--$emit

 ②sync

③v-model


1、父传子

props让组件接收外部传过来的数据
传递数据<Demo name="xxx" :age="18"/〉这里age前加∶通过v-bind使得里面的18是数字接收数据
第—种方式(只接收)props : [ 'name ' , "age ']
第二种方式(限制类型)props :{name : String,age :Number};

第三种方式(限制类型、限制必要性、指定默认值)
备注: props是只读的,Vue底层会监测你对props 的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中,然后去修改data中的数据

2、子传父

①自定义事件--$emit

 App父组件

<template>
  <div id="root">
    <h1>{{ title }}----{{ ageFormSon }}</h1>
    <Left @agechange="getNewCount"></Left>
  </div>
</template>

<script>
import Left from "./components/Left";

export default {
  name: "App",
  data() {
    return {
      title: "这是父组件",
      ageFormSon: 0,
    };
  },
  components: {
    Left,
  },
  methods: {
    // 获取子组件传递过来的事件
    getNewCount(val) {
      console.log("事件触发了", val);
      this.ageFormSon = val;
    },
  },
};
</script>

Left子组件

<template>
  <div>
    <h1>{{ name }}</h1>
    <h2>{{ age }}</h2>
    <button @click="add">+1</button>
  </div>
</template>

<script>
import Left from "./Left";
export default {
  name: "MyList",
  components: { Left },
  data() {
    return {
      name: "刘",
      age: 18,
    };
  },
  methods: {
    add() {
      this.age += 1;
      // 把自增的结果,传给父级
      this.$emit("agechange", this.age); //只要age+1就会触发$emit
      //  agechange这里的名字要和父组件中自定义事件里的一致
    },
  },
};
</script>

效果:点击+1时父与子组件数字都会改变

 ②sync

和第一种相比,methods中可以不写方法(省略了绑事件),更简单,sync相当于帮我更新a1的值

APP父组件:

相当于语法糖:绑了个事件来修改,并且msg由a1的值来决定的

效果如图:

子组件中:updata为固定写法,代码中的意思为更新a1中的数据

③v-model

 子组件中没加$emit时:

 最终效果图:

### 实现 Vue 子组件间通过点击事件Vue 中,可以通过 `props` `$emit` 来实现子组件间的递。当涉及到点击事件时,通常会在组件中定义数据并通过 `props` 将其递给子组件,在子组件中触发点击事件并将更新后的通过 `$emit` 返回给组件。 以下是具体的实现方式: #### 组件到子组件的数据组件通过 `props` 向子组件递初始[^2]。 ```html <template> <div> <!-- 子组件接收来自组件的 --> <ChildComponent :message="parentMessage" @update-message="handleUpdate"></ChildComponent> <p>当前消息:{{ parentMessage }}</p> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: '这是来自组件的消息' }; }, methods: { handleUpdate(newMessage) { this.parentMessage = newMessage; } } }; </script> ``` #### 子组件中的点击事件处理 子组件接收到组件递的后,可以在内部定义一个按钮或其他交互元素,并在其上绑定点击事件。点击事件会调用方法并通过 `$emit` 更新组件的状态[^3]。 ```html <template> <div> <p>{{ message }}</p> <button @click="sendMessage">修改消息</button> </div> </template> <script> export default { props: ['message'], // 接收组件递的 methods: { sendMessage() { const updatedMessage = '这是子组件发送的新消息'; this.$emit('update-message', updatedMessage); } } }; </script> ``` 以上代码实现了以下功能: 1. **组件初始化数据** 并将其作为 `props` 递给子组件。 2. **子组件展示数据** 并允许用户通过点击按钮触发事件。 3. **子组件通过 `$emit` 发送新组件**,从而动态更新显示的内容。 --- ### 提供更复杂的双向绑定示例 如果希望简化子组件之间的通信逻辑,可以利用 Vue 的增强版 `v-model` 或自定义事件名称[^5]。这种方式适用于需要频繁同步多个字段的情况。 #### 组件模板 ```html <template> <div> <ChildComponent v-model:message="parentMessage"></ChildComponent> <p>当前消息:{{ parentMessage }}</p> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: '这是来自组件的消息' }; } }; </script> ``` #### 子组件模板 ```html <template> <div> <input type="text" :value="modelValue" @input="updateModel"> <button @click="sendCustomEvent">发送自定义事件</button> </div> </template> <script> export default { props: ['modelValue'], emits: ['update:modelValue'], methods: { updateModel(event) { this.$emit('update:modelValue', event.target.value); }, sendCustomEvent() { this.$emit('custom-event', '这是一个自定义事件'); } } }; </script> ``` 此示例展示了如何使用 `v-model` 进行双向绑定以及如何通过自定义事件通知组件其他操作的结果。 --- ### 高级场景下的推荐做法 为了提高可维护性代码质量,建议遵循以下最佳实践: - 使用 TypeScript 明确声明事件参数类型; - 自定义事件命名采用 kebab-case 格式(如 `update-title`),以便于区分原生 DOM 事件; - 对复杂数据结构进行封装后再递,减少不必要的解耦风险; ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值