- <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的使用
-
- import { createStore } from 'vuex'
-
- // 创建一个vuex并导出
- export default createStore({
- state: {
- num: 1
- },
-
- mutations: {
- add (state) {
- state.num += 1
- }
- }
- })
- <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>
封装input组件实现并实现双向绑定
- <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>
- <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>