第三十节——组合式API组件传值

一、父传子

子组件

<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>
相关推荐
码蜂窝编程官方19 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
gqkmiss19 分钟前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃25 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰29 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye35 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm37 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
乐闻x1 小时前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚1 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
Amd7941 小时前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子