当前位置: 首页 > news >正文

vue3父子组件传值 以及注意事项

当你在进行父子组件传值的时候报警告:
Property “value” was accessed during render but is not defined on instance.
at

warn]: Extraneous non-emits event listeners (xxx) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the “emits” option.
at <ChilDen title=“” msg=“ooooo” onXxx=fn >
at
在这里插入图片描述
在这里插入图片描述
然而在vue2中就不报这个警告。

解决办法:两种

1.在接收的参数后边跟上类型就OK(ts)
2.用emits:[‘接收你推送的事件’](js)

在这里插入图片描述
以下是代码分析

我用的是 ts+vue3
首选我们对比vue2来看,vue3在写法发生了不小的变化,最典型的例子就是vue3通过ref,或者reactive实现数据的响应式。因为ref和reactive的出现,使得vue3中父子组件的传值方式也发生了变化

咱们先看下vue2中的写法

父子组件传值 props / this.$emit

父组件向子组件传值:在子组件标签上绑定自定义属性名(:child = ‘value’),值是父组件要传递的数据,在子组件内部通过props 属性来接收 ‘自定义属性名’,页面在展示上,通过接收的 {{属性名}} 显示。(父子之间是上下传值)

子组件向父组件传值:在子组件标签上绑定自定义事件(@change= ‘change’),子组件内部通过 $emit 给该事件推送数据 (this. $emit(‘绑定的自定义事件名’,this.数据))。父组件内部通过“函数参数”接收。(子组件之间是平行传值)

父组件

<template>
  <div>
    <children :title="title" @getChildren="getChildren"></children>
    <div>子组件说: {{ childrenAsk }}</div>
  </div>
</template>
<script>
  import children from "./children.vue"
  export default {
    data() {
      return {
        title: "我是父组件传过来的值",
        childrenAsk: "" // 接收子组件传值的赋值
      }
    },
    methods: {
      getChildren(val) {
        this.childrenAsk = val
      }
    }
  }
</script>

子组件

<template>
  <div>
    <div>父组件传过来的值: {{ title }}</div>
    <button @click="askToFather">点击发送给父组件</button>
  </div>
</template>
<script>
  export default {
    props: {
      title: {
        type: String
      }
    },
    data() {
      return {
        askMsg: "这是我给父组件说的话"
      }
    },
    methods: {
      askToFather() {
        this.$emit("getChildren", this.askMsg) // 推送的的自定义事件
      }
    }
  }
</script>

但是vue3中,是不存在this的,vue3中将数据和函数都封装在了setup中,那么vue3是怎么实现的呢?
我们知道vue3中的setup接收两个参数,
第一个参数是props,即父组件向子组件传递的props值,
第二个值为context,这个值代表了当前的上下文对象,

知道这个东西以后现在来实现vue3的父子组件传值。

vue3中父传子和vue2中的父传子一样,再次不做过多阐述,下面重点关注的是vue3的子传父

父组件

<template>
  <div style="color: aqua">父组件</div>
  <button @click="uodata">给子组件</button>
  <h4>子传过来的-- {{ children_msg }}</h4>
  <hr />
  <Children :title="msg" :msg="datamsg" @xxx="hh"></Children>
  {{ value }}
</template>
<script lang="ts">
	import Children from "./components/ChilDen.vue";
	import { defineComponent, ref } from "vue";
	export default defineComponent({
	  components: {
	    Children,
	  },
	  name: "App",
	  setup() {
	    let msg = ref("");
	    let datamsg = ref("ooooo");
	    function uodata() {
	      msg.value = msg.value + "44";
	    }
	
	    // ref的作用是实现响应式, 如果没有ref则不能实现响应式(引用数据类型用reactive)
	    let children_msg = ref("");
	    console.log(children_msg, "children_msg");
	    function hh(val: string) {  // 警告解决办法: 加类型
	      console.log(val, "val");
	      // 使用ref包裹的数据,需要通过 .value 的形式访问他的值
	      children_msg.value = val;
	    }
	    return {
	      msg,
	      datamsg,
	      uodata,
	      hh,
	      children_msg,
	    };
	  },
	});
</script>

子组件:、

<template>
  <div style="color: brown">子组件</div>
  <div>父组件传过来的值为:{{ title }}-- {{ msg }}</div>
  <button @click="emitxx">给父组件</button>
</template>
<script lang="ts">
import { defineComponent } from "vue";
export default defineComponent({
  name: "ChilDen",
  props: {
    title: {
      type: String,
    },
    msg: {
      type: String,
    },
  },
  setup(prop, context) {
    // props 参数,是一个对象,里面有父级组件向子组件传递的数据,
    // 且是在子组件中使用props接收到的所有的属性
    // 包含props 配置声明且传入了的所有属性的对象
    console.log(prop, context);
    // context.attrs 可以查询到在props中没有定义的属性
    // console.log(context.attrs.msg);
    function emitxx() {
      let ask = "nihao";
      // context作用是获取上下文对象,
      // 如果setup写法为setup(props, { emit })的方式的话,下面的context可以省略
      context.emit("xxx", ask);
    }
    return {
      emitxx,
    };
  },
});
</script>

看下效果
在这里插入图片描述

相关文章:

  • “通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决
  • vue项目 初始化 解决页面闪屏问题 v-cloak
  • Excle中LOOKUP经典用法
  • vue3实现 TodoList 运用到的点 组件传值props, ref, onMounted, reactive, toRefs, watch
  • 前端——运用@media实现网页自适应中的几个关键分辨率
  • vue3 实现 todoList 知识点 reactive, toRefs, computed, watchEffect, filters,localStorage数据存储、获取
  • vue 项目 前端 模拟后端接口数据(vue2,vue3)
  • JSON.toJSONString的jar包问题
  • vue3-cli创建项目后每个文件的第一行都爆红,或者每个文建都 : No Babel config file detected for...
  • vue3路由传参 query 、params
  • Dom4j把xml转换成Map(非固定格式)
  • vue2 和 vue3 的 路由守卫
  • Android EventBus 3.0.0 使用总结
  • vue3 中vuex状态管理
  • 用过属性来给标签加样式
  • CSS魔法堂:Absolute Positioning就这个样
  • django开发-定时任务的使用
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • node.js
  • React+TypeScript入门
  • 安卓应用性能调试和优化经验分享
  • 复习Javascript专题(四):js中的深浅拷贝
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 技术:超级实用的电脑小技巧
  • 简单基于spring的redis配置(单机和集群模式)
  • 如何解决微信端直接跳WAP端
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 为什么要用IPython/Jupyter?
  • 优秀架构师必须掌握的架构思维
  • Python 之网络式编程
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​虚拟化系列介绍(十)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #{}和${}的区别?
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (规划)24届春招和25届暑假实习路线准备规划
  • (译)2019年前端性能优化清单 — 下篇
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .“空心村”成因分析及解决对策122344
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /etc/shadow字段详解
  • @PreAuthorize注解
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节