第三十节——组合式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>
相关推荐
Slow菜鸟2 分钟前
ES5 vs ES6:JavaScript 演进之路
前端·javascript·es6
小冯的编程学习之路5 分钟前
【前端基础】:HTML
前端·css·前端框架·html·postman
Jiaberrr1 小时前
Vue 3 中搭建菜单权限配置界面的详细指南
前端·javascript·vue.js·elementui
科科是我嗷~1 小时前
【uniapp】textarea maxlength字数计算不准确的问题
javascript·uni-app·html
懒大王95271 小时前
uniapp+Vue3 组件之间的传值方法
前端·javascript·uni-app
烛阴2 小时前
秒懂 JSON:JavaScript JSON 方法详解,让你轻松驾驭数据交互!
前端·javascript
拉不动的猪2 小时前
刷刷题31(vue实际项目问题)
前端·javascript·面试
zeijiershuai2 小时前
Ajax-入门、axios请求方式、async、await、Vue生命周期
前端·javascript·ajax
恋猫de小郭2 小时前
Flutter 小技巧之通过 MediaQuery 优化 App 性能
android·前端·flutter
只会写Bug的程序员3 小时前
面试之《webpack从输入到输出经历了什么》
前端·面试·webpack