第三十节——组合式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>
相关推荐
程序员_三木17 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
顾平安1 小时前
Promise/A+ 规范 - 中文版本
前端
聚名网1 小时前
域名和服务器是什么?域名和服务器是什么关系?
服务器·前端
桃园码工1 小时前
4-Gin HTML 模板渲染 --[Gin 框架入门精讲与实战案例]
前端·html·gin·模板渲染
沈剑心1 小时前
如何在鸿蒙系统上实现「沉浸式」页面?
前端·harmonyos
一棵开花的树,枝芽无限靠近你2 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
m0_748237052 小时前
Chrome 关闭自动添加https
前端·chrome
prall2 小时前
实战小技巧:下划线转驼峰篇
前端·typescript
开心工作室_kaic2 小时前
springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
前端·javascript·vue.js
川石教育2 小时前
Vue前端开发-缓存优化
前端·javascript·vue.js·缓存·前端框架·vue·数据缓存