Vue 组件通信例子

使用两个组件, 一个组件ActiveUser显示姓名和年龄,另一个组件 UserData 可以修改这两项,如图所示:
在这里插入图片描述

工程里总共4个主要的文件:
在这里插入图片描述

  1. main.js:
import { createApp } from "vue";
import App from "./App.vue";
import ActiveUser from "./components/ActiveUser.vue";
import UserData from "./components/UserData.vue";

const app = createApp(App);
// 注册组件
app.component("active-user", ActiveUser);
app.component("user-data", UserData);

app.mount("#app");
  1. App.vue 为最上层组件,这里在 UserData 组件上监听 UserData 发出的事件 set-data
<template>
    <div id="app">
        <active-user :user-name="user.name" :user-age="user.age"> </active-user>
        <user-data @set-data="setUserData"></user-data>
    </div>
</template>

<script>
    export default {
        data() {
            return { 
                user: {
                    name: "anonymous",
                    age: 0,
                }
            }
        },
        methods: {
            setUserData(name, age) {
            	// 使用符号 + 将String类型转换为Number 
                this.user = { name, age: +age, };
            },
        },
    }
</script>

<style>
html {
    font-family: sans-serif;
}

section {
    margin: 2rem auto;
    max-width: 30rem;
    border: 1px solid #ccc;
    padding:1rem;
    box-shadow: 5px 5px 5px -5px grey;
}

form {
    display:flex;
    flex-direction: column;    
    justify-content: center;
    align-items: left;
}

input,button {
    width:20rem;
    margin-bottom: 1rem;
    padding: 0.5rem;
    font-size: 1rem;
}

button {
    width:10rem;
    border: none;
    background: purple;
    color:white;
}
</style>
  1. ActiveUser.vue:
<template>
    <section>
       <h2>Name: {{userName}} </h2>
       <h3>Age: {{userAge}} Years</h3> 
    </section>
</template>

<script> 
export default {
    props: {
        userName: {
            type: String,
            required: true,
        }, 
        userAge: {
            type: Number,
            required: true,
        }
    },
}
</script>
  1. UserData.vue, v-model实现双向绑定。
<template>
    <section>
        <form @submit.prevent="submitData">
            <input type="text" placeholder="Your name" v-model="enteredName">
            <input type="text" placeholder="Your age" v-model="enteredAge" >
            <button>Set User Data</button>
        </form>
    </section>
</template>
<script> 
export default {
    emits: ['set-data'],
    data() {
        return {
            enteredName: "",
            enteredAge: "",
        }
    },
    methods: {
        submitData() {
            this.$emit("set-data", this.enteredName, this.enteredAge);
        }
    }
}

</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值