一、父传子
子组件
<template>
<div>
<v3></v3>
</div>
</template>
<script setup>
// 直接引入对应的组件 无需注册可以直接使用
import v3 from "./v3.vue";
import { defineProps } from 'vue'
/**
* 定义接收父组件传过来的参数
* 对象里面的选项和props一直
*/
defineProps(['name'])
</script>
父组件
<template>
<div>
<v3 name="李四"></v3>
</div>
</template>
<script setup>
// 直接引入对应的组件 无需注册可以直接使用
import v3 from "./v3.vue";
</script>
子组件
<template>
<div>哈哈哈{{ name }}</div>
</template>
<script setup>
import { defineProps } from "vue";
/**
* 定义接收父组件传过来的参数
* 对象里面的选项和props一直
*/
defineProps(["name"]);
</script>
二、子传父
父组件
<template>
<div>
<!-- 传入的方法 -->
<v3 @get="get" name="李四"></v3>
</div>
</template>
<script setup>
// 直接引入对应的组件 无需注册可以直接使用
import v3 from "./v3.vue";
const get = (val) => {
console.log(val)
}
</script>
子组件
<template>
<div>哈哈哈{{ name }}</div>
<button @click="toParentData">往父组件传值</button>
</template>
<script setup>
import { defineProps, defineEmits } from "vue";
/**
* 定义接收父组件传过来的参数
* 对象里面的选项和props一直
*/
defineProps(["name"]);
// 定义一个变量来接收父组件传来的方法
const emit = defineEmits(["get"]);
// 定义一个事件
const toParentData = () => {
// 使用emit往父组件传
emit("get",'我是这里传过去的')
}
</script>
三、祖孙传值
上级组件
<template>
<div>
<Child1 @handle2="handle" name="来自爷爷的问候"></Child1>
</div>
</template>
<script setup>
import Child1 from "./child1.vue";
import { provide } from "vue";
/**
* 统一下发
*/
provide("info", { name: "张三", age: 18 });
</script>
孙级组件
<template>
<div>孙组件 ---{{ info.name }}</div>
</template>
<script setup>
import { inject } from 'vue'
// 拿到上层下发的值
const info = inject('info')
</script>
四、同级组件
推荐使用状态管理,这里简单介绍一下vuex的使用
1、定义store
import { createStore } from 'vuex'
// 创建一个vuex并导出
export default createStore({
state: {
num: 1
},
mutations: {
add (state) {
state.num += 1
}
}
})
2、在页面中使用
<template>
<div>
<!-- 在template里面使用和一前一样 -->
我是vuex {{ $store.state.num }}
<button @click="add">vuex +1</button>
</div>
</template>
<script setup>
// 引入store
import { useStore } from 'vuex'
// 老规矩,拿钩子创建一个store
const store = useStore()
const add = () => {
// 调用方式和vue2几乎一样,只要注意使用useStore() 返回的调用就行
store.commit("add")
}
</script>
五、自定义组件使用v-model
封装input组件实现并实现双向绑定
1、父级组件
<template>
<div>
<!--
在自定义组件上使用v-model
需要在后面加上:参数名,这个参数名会被子组件接收
-->
<qf-input v-model:value="name"></qf-input>
{{ name }}
</div>
</template>
<script setup>
import { ref } from "vue";
const name = ref("张三");
</script>
2、子组件
<template>
<div>
<input :value="value" @input="inputChange" type="text" placeholder="一个普通的输入框" />
</div>
</template>
<script setup>
/**
* 这个value属性是 v-model传入的
* 这个value 必须 和 传入的参数名一致
*/
defineProps(["value"]);
/**
* 必须使用update:加上双向绑定的参数名
*/
const emit = defineEmits(["update:value"]);
const inputChange = (event) => {
/**
* 参数每次改变的时候 emit 抛出一个事件
* 会自动 修改传入的值
*/
emit("update:value", event.taget.value);
};
</script>