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

Vue 子组件修改父组件值的解决方法

分析

vue中父组件向子组件传值时,其父子prop之间形成单向下行绑定,反过来则不行,这样可以防止子组件意外改变父组件的值,怕子组件污染父组件,造成不可控; 此外,每次父组件的数据发生更新时,子组件的值都会更新到最新的数据,但不能直接在子组件内部改变prop(父组件传过来的值),否则浏览器就会发出警告

但我们可能会遇到,需要在子组件修改父组件值的需求,这里介绍三种方法实现:

实现

方法一:通过$emit派发一个自定义事件,父组件收到后,由父组件进行修改

子组件:接受父组件传来的cateId值,但是子组件使用本身的计算属性myCateId进行绑定和修改,一旦值发生改变,便通过向上提交函数this.$emit('changeCate', val)向父组件提交

<!-- 注意子组件里是绑定的计算属性,不是父组件传来的prop里的值 -->
<treeselect
  v-model="myCateId"
  :options="cates"
  :load-options="loadCates"
  placeholder="请选择类别"
/>

export default {
	props: {
		cateId: {
			type: Number,
			default: null
		}
	},
	data() {
		return {
		  cates: [] // 类别列表
		}
	},
	computed: {
		myCateId: {
			get() {
			  return this.cateId
			},
			set(val) {
			  this.$emit('changeCate', val)
			}
		}
	}
}

父组件:引用子组件,并定义改变函数,接受子组件传来的改变值对本身的值进行修改

<!-- 父组件引用子组件 -->
<CateSelect
	:cate-id="form.categoryId"
	style="width: 370px;"
	@changeCate="changeCate"
/>

changeCate(val) {
  this.form.categoryId = val
},
方法二:只要prop是对象或者数组,在子组件里面就可以修改从而改变父组件的值

在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。

父组件:引用子组件,定义引用类型数据并传递到子组件

<preview :pre="pre" />

data() {
 return {
    pre: {
      isShow: false,
      flName: '',
      flType: ''
    }
  }
},

子组件:直接修改父组件传来的引用类型数据,则父组件的数据也会被修改

<div @click="changePre"></div>

props: {
  pre: {
    // 控制该组件是否显示
    isShow: {
      type: Boolean,
      default: false
    },
    // 浏览文件名(服务器存储的加上UUID的文件名)
    flName: {
      type: String,
      default: null
    },
    // 浏览文件类型,true为图片,false为文档
    flType: {
      type: String,
      default: false
    },
    type: Object,
    default: null
  }
},
methods: {
  changePre() {
    this.pre.isShow = true
  }
}

建议

注意:虽然有两种方法可以实现子组件修改父组件值,但是官方是不推荐在子组件内修改通过prop传入的父组件的值,推荐使用vuex

相关文章:

  • ubuntu 安装笔记
  • 百度富文本编辑器ueditor支持上传mp3格式等音频文件的方法
  • 前端性能优化之vue-cli3 开启gizp压缩及nginx配置
  • 关于php操作http header
  • 力扣 反转链表II
  • 本周技术关注:Awstats、Mrtg、Webalizer How-TO Articles
  • 力扣打卡:有效的字母异同位
  • Hibernate 3.2 SQL函数返回类型从Integer变为Long
  • 浅谈vue中index.html、main.js、App.vue、index.js之前的关系以及加载过程
  • 忠厚开发者与“厚道”甲方II(超级Demo)——CSDN外包实践(38)
  • eladmin前端 学习笔记
  • 外包频道服务能力共建,项目顾问CRM管理——CSDN外包实践(39)
  • js中map与foreach的区别
  • em与rem的区别与使用
  • AI编辑器设想
  • Docker入门(二) - Dockerfile
  • export和import的用法总结
  • HashMap ConcurrentHashMap
  • iOS 系统授权开发
  • java小心机(3)| 浅析finalize()
  • PHP 小技巧
  • Python连接Oracle
  • rc-form之最单纯情况
  • VuePress 静态网站生成
  • 机器学习中为什么要做归一化normalization
  • 前端性能优化--懒加载和预加载
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 删除表内多余的重复数据
  • 跳前端坑前,先看看这个!!
  • 自定义函数
  • ​ubuntu下安装kvm虚拟机
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (20050108)又读《平凡的世界》
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十六)一篇文章学会Java的常用API
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (译) 函数式 JS #1:简介
  • (转) Face-Resources
  • (转)用.Net的File控件上传文件的解决方案
  • .net core 6 集成和使用 mongodb
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @JsonFormat与@DateTimeFormat注解的使用
  • [17]JAVAEE-HTTP协议
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [c]扫雷
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [docker] Docker的数据卷、数据卷容器,容器互联