应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue3,vue组件,props给一个对象参数。vue组件间传参数,vue父组件给子组件传参数。组件参数类型。父组件调用子组件的方法。vue组件事件监听,给子组件传递方法,子组件调用父组件方法

9219人阅读 2020/7/1 16:55 总访问:5182796 评论:0 收藏:0 手机
分类: 前端

组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。

下面是个简单的例子:

  1. <div id="components-demo">
  2. <blog-post test="aaa" content="哈哈哈"></blog-post>
  3. <blog-post test="hello component" content="嘿嘿嘿"></blog-post>
  4. </div>
  5. <script>
  6. //向子组件传值
  7. Vue.component('blog-post', {
  8. props: ['test', "content"],
  9. template: '<h3>{{ test }}:{{content}}</h3>'
  10. })
  11. var vm = new Vue({
  12. el: '#components-demo'
  13. });
  14. </script>

效果如下:




在贴一个传多个props简单的例子,可以自己运行看看效果:

  1. <div id="blog-post-demo">
  2. <blog-post
  3. v-for="post in posts"
  4. v-bind:mykey="post.id"
  5. v-bind:title="post.title"></blog-post>
  6. </div>
  7. <script>
  8. //向子组件传值
  9. Vue.component('blog-post', {
  10. props: ['mykey', "title"],
  11. template: '<h3>{{ mykey }}:{{title}}</h3>'
  12. });
  13. new Vue({
  14. el: '#blog-post-demo',
  15. data: {
  16. posts: [
  17. { id: 1, title: 'My journey with Vue' },
  18. { id: 2, title: 'Blogging with Vue' },
  19. { id: 3, title: 'Why Vue is so fun' }
  20. ]
  21. }
  22. })
  23. </script>




但是如果一个组件内部需要的参数很多,不可能去定义那么多的props参数,还要用那么多的v-bind去给props钟的参数赋值,这个时候就可以只给一个props参数,给一个对象,然后只需要给一个参数使用v-bind赋值即可。

  1. <div id="blog-post-demo">
  2. <blog-post v-for="article in myArticles" v-bind:article="article"></blog-post>
  3. </div>
  4. <script>
  5. //向子组件传值
  6. Vue.component('blog-post', {
  7. props: ['article'],
  8. template: '<div><h4>{{article.title}}</h4><div>{{article.content}}</div><div>作者:{{article.autor}}</div></div>'
  9. });
  10. new Vue({
  11. el: '#blog-post-demo',
  12. data: {
  13. myArticles: [
  14. { content: "只要你敢,我会毫不犹豫地跟你走,不顾一切,带着一腔勇敢和爱,跟你走。可是啊,你还是不敢", title: '文章一', autor: "aa" },
  15. { content: "还是很喜欢你,性情善良,待人真诚,像日光洒满天地,温柔惬意", title: '文章二', autor: "xx" },
  16. { content: "想把每天发生的事都分享给你的人大概是真的真的很喜欢你吧", title: '文章三', autor: "jj" }
  17. ]
  18. }
  19. });
  20. </script>

注意几点

  • props: [‘article’] 也要设置一个参数,虽然可以是对象。但是也要提供
  • 使用v-bind提供参数,比如这里的v-bind:article。 如果不提供参数模块里边是拿不到的
  • 外面使用组件的时候提供值的名称和组件里边的无关,可以随便取,比如这里组件里边定义的props属性名叫article,但是外面我使用的是data使用的是myArticles

效果如下:

Vue组件传递参数的类型常用可选的有

  1. 'title':String,
  2. 'bool':Boolean,
  3. 'getFun':Function

普通类型:字符串(String)、数字(Number)、布尔值(Boolean)、空(Null)
引用类型:数组(Array)、对象(Object)

常用类型的定义示例:

  1. // 组件参数
  2. props: {
  3. percentage: {
  4. type: Number,
  5. default: 0
  6. },
  7. title: {
  8. type: String,
  9. default: ''
  10. },
  11. show: {
  12. type: Boolean,
  13. default: false
  14. },
  15. // 列配置
  16. columnsConfg: {
  17. type: Array,
  18. default: () => {
  19. return []
  20. },
  21. },
  22. // 数据项
  23. rowdata: {
  24. type: Array,
  25. default: () => {
  26. return []
  27. },
  28. // required: true
  29. }
  30. // 对象参数
  31. datas: {
  32. type: Object,
  33. default: () => {
  34. return {CompleteRate:50,PassRate:60,TrueRate:80}
  35. },
  36. }
  37. },

常用类型的使用示例:

Boolean类型:

  1. <MyGrid title="图表展示" :Showtitle="false" style="height:100%">
  2. </MyGrid>

对象类型:

  1. <DataChart :datas="datas" />

数据也是按照正常的方式提供即可

  1. data() {
  2. return {
  3. datas:{CompleteRate: 60, PassRate: 70, TrueRate: 90},
  4. }
  5. },

字符串类型,int类型,数组类型
提供参数的时候具体加不加冒号,看着是直接给的还是通过数据绑定上去的

  1. <ScrollTable rowStyle="content_tr_center" :runSpeed="teacherDataRunSpeed" :scrollContentHeight=310
  2. :columnsConfg="teacherColumnsConfg" :rowdata="teacherRowdata">
  3. </ScrollTable>

其中数组类型提供的值也和正常绑定的一样的放到data里边就行,比如

  1. data() {
  2. return {
  3. teacherColumnsConfg: [
  4. {
  5. label: "教员",
  6. prop: "teacherName",
  7. width: "90px",
  8. },
  9. {
  10. label: "班级数",
  11. prop: "classCount",
  12. width: "90px",
  13. },
  14. {
  15. label: "课程数",
  16. prop: "courseCount",
  17. width: "90px",
  18. }
  19. }
  20. }
  21. }

vue3里边父组件给子组件传参

传递:

  1. <OceanFreightTableEdit title="海运费" :isCanEditOceanFreight="ruleForm.isCanEditOceanFreight" ref="OceanFreightTableEditRef"></OceanFreightTableEdit>

默认参数:

  1. const props = defineProps({
  2. schoolId: String,
  3. taskIds: {
  4. type: [] as any,
  5. default:[]
  6. },
  7. IsQueryMySelf: {
  8. type: Boolean,
  9. default: false
  10. },
  11. })

接收

  1. const props = defineProps({
  2. title: String,
  3. isCanEditOceanFreight: Boolean
  4. })

取值:

  1. <el-checkbox v-if="props.isCanEditOceanFreight" checked="true" disabled="true" v-model="isCanEdit" size="default" />

取值直接可以这样:props.isCanEditOceanFreight,props.title这种。


注意:父向子传参数的时候要注意时机问题哦,比如要传递的某个参数要从接口里边查询回来,然后组件的加载要比接口数据返回回来之前被加载了,这样传递到组件里边的参数永远都是默认的参数,不会是从接口回来的参数,所以这种情况就要进行处理,可以考虑等接口返回回来了在去加载组件,或者在子组件里边去监听一下父组件传递参数的值的变化也可以。

vue父组件调用子组件的方法

可以直接使用ref,在引用子组件的地方添加一个ref

  1. <FeedbackDialog ref="feedbackDialog" />

然后通过ref的名字拿到子组件就可以调用子组件的方法了

  1. this.$refs.feedbackDialog.openFeedbackDialog();

可以用来传递参数,或者需要一个字段双向绑定的时候可以参考使用这种方式

vue3父组件调用子组件的方法

子组件

<script setup>中子组件需要使用defineExpose暴露出来需要的方法,才能被父组件调用

  1. // 子组件需要使用defineExpose暴露出来需要的方法,才能被父组件调用
  2. defineExpose({ getTrainingSubProgramList })

父组件

  1. <SubProgramPublic ref="subProgramPublicRef"></SubProgramPublic>
  2. // 注意:这里的属性名必须跟子组件定义的 ref 值一模一样,否者会关联失效
  3. const subProgramPublicRef = ref(null)
  4. const subProgramSaveSuccess = ()=>{
  5. // 调用子组件的方法
  6. subProgramPublicRef.value.getTrainingSubProgramList()
  7. }

vue组件事件监听,给组件传递方法。子组件事件触发父组件方法

封装的组件里边,使用$emit方法就行,规定一个方法名称

  1. <div class="title_com_menu" v-if="ShowtitleMenu" @click="$emit('menuclick','可以传递需要的参数回去')">
  2. <div class="title_com_menu_dot"></div>
  3. <div class="title_com_menu_dot"></div>
  4. <div class="title_com_menu_dot"></div>
  5. </div>

然后使用的时候这样就行

  1. <MyGrid style="height:100%" title="教学动态" :ShowtitleMenu="true" @menuclick="menuclick()"/>
  2. <MyGrid style="height:100%" title="学习数据" :ShowtitleMenu="true" @menuclick="learnDataMore()"/>

内部当前不一定要在@click中去触发,其他方式也可以,比如在表单填写好数据,进行数据验证成功后在调用引用组件时候定义的方法,相当于就类似一个回调函数的使用方式,但是用起来要灵活一些随时定义,随时使用

  1. saveLoadPortCharges() {
  2. var self = this
  3. self.$refs['editFormRef'].validate((valid) => {
  4. if (valid) {
  5. console.log(self.editFromData)
  6. // 通过emit调用引用组件时候定义的方法
  7. self.$emit('insertData',self.editFromData)
  8. }
  9. })
  10. }

但是要注意这种方式父子组件只能跨一级,不能跨两级,比如子组件调用爷爷组件就不行。

如果是跨越多级可以这样使用

  1. my.$parent.$parent.changeLabroomTodayCount(res.data.todayCount)

跨几级就调用几次$parent
还可以使用EventBus等方式比如:https://blog.csdn.net/weixin_44867717/article/details/125632991

vue3子组件调用父组件方法

子组件:

  1. <template>
  2. <view class="container">
  3. <view @click="handleClose">关闭</view>
  4. </view>
  5. </template>
  6. const emit = defineEmits(['closePopup'])
  7. const handleClose = () => {
  8. emit('closePopup','参数')
  9. }

父组件:

  1. <uni-popup ref="classRankingPopup" type="bottom" @change="change">
  2. <classSort :classRankData="state.classRankData" @closePopup="closeClassRankingPopup"></classSort>
  3. </uni-popup>

如果是有多个方法就这样

子组件

  1. <template>
  2. <view class="popup-container">
  3. <view class="titleWrap">
  4. <view class="title">{{ title }}</view>
  5. <view class="closeTag" @tap="handleClose">×</view>
  6. </view>
  7. <scroll-view scroll-y="true" style=" height: 666rpx;">
  8. <view class="pc-content" >
  9. <view class="pcc-item" @tap="choiseClass(item.id,item.className)" v-for="(item, index) in state.classList" :key="index">
  10. {{item.className}}
  11. </view>
  12. </view>
  13. </scroll-view>
  14. </view>
  15. </template>
  16. // 触发closePopup事件(关闭事件)
  17. const emit = defineEmits(['closePopup','choiseClass'])
  18. const handleClose = () => {
  19. emit('closePopup', '参数')
  20. }
  21. // 点击选择了班级,传递了班级id和班级名称
  22. const choiseClass = (_classId:string,_className:string) => {
  23. emit('choiseClass', _classId,_className)
  24. }

父组件:

  1. <uni-popup ref="choiseClassPopup" background-color="#fff" border-radius="60rpx 60rpx 0rpx 0rpx;" type="bottom"
  2. @change="methods.change">
  3. <choiseClass @closePopup="popupMethods.closeChoiseClassDetails" @choiseClass="methods.choiseClass"></choiseClass>
  4. </uni-popup>
  5. const methods = {
  6. // 弹窗里边重新选择班级后的查询
  7. choiseClass: function (_classId: string,_className:string) {
  8. console.log("重新选择班级了",_classId)
  9. // 关闭弹窗
  10. popupMethods.closeChoiseClassDetails()
  11. state.classId = _classId
  12. state.className =_className
  13. }
  14. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

饰心

2020/7/10 9:46:00

哇  好神奇

剑轩:@饰心嘿嘿嘿,那个全局变量怎么优化呢。就是在data里边定义不用全局变量

2020/7/11 12:25:07 回复

vs2017 对 COM 组件的调用返回了错误 HRESULT E_FAIL

vs2017添加引用报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL 1.以管理员身份打开vs2017开发人员命令指示符 2...

vue.js 学习日记第六章-vue组件初步学习

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第五章: http://www.tnblog.net/18323015640/article/details/2...

检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败原因是出现以下错误: 80070005 拒绝访问

最近在做一个关于word,ppt,Excel在线预览的功能,期间出现了几个问题,也不算棘手,但是对于第一次使用office组件的人来...

Angular使用组件时遇到的一些错误整理

先看看代码exportclassSidenavComponentimplementsOnInit{ privatemediaMatcher:MediaQueryList=matchMedia(`(max-width...

.net core视图组件

.net core中没有Html.RenderAction(&quot;action&quot;, &quot;控制器&quot;); 这种方法了使用视图组件代替了创建视图组件...

ionic父子组件的传值方式

Angular里面组件的灵活使用相当于页面的嵌套 子页面父页面这种 公共部分要很多地方要用,但是没有后端这么牛逼撒 只能子父...

layui简单树形组件layui tree

html:&lt;divid=&quot;test&quot;class=&quot;demo-tree-more&quot;&gt;&lt;/div&gt;js:layui.use([&#39;tree&#39;,&#39;ut...

layui树形组件动态选择layui tree

可以根据id来选中tree.setChecked(&#39;demoId1&#39;,[12,16]);//勾选指定节点获取树形id的用后台来就可以实现动态选中了//...

import 引入vue 组件命名规则vue引入自定义的组件

端午节快乐~其实就是两种方法:第一种就是完全按照组件的名字去使用&lt;template&gt; &lt;MainLayout&gt; &lt;p&gt;我是...

vue组件之间函数调用

父组件调用子组件:html:&lt;Childref=&quot;myChild&quot;&gt;&lt;/Child&gt;js://父组件 //引入子组件 importChildfrom...

.net core 选项框架:服务组件集成配置的最佳实践

.net core 选项框架:服务组件集成配置的最佳实践[TOC] 如何通过选项框架来处理服务和配置的关系? 特性 支持单例模式...

bootstrap一个不错的树形组件

先看看效果嘛,还是有点乖的,功能也算是比较强大,支持右键菜单,支持随意拖动。哈哈哈长得好看,还有内涵html:其实除了引...

.net core 结构化日志组件Serilog:记录对查询分析友好的日志

.net core 结构化日志组件Serilog:记录对查询分析友好的日志[TOC] 结构化日志的好处 易于检索易于分析统计 场景举例 ...

vue 父组件调用子组件方法或子组件调用父组件方法

一父组件调用子组件方法子组件定义一个 ref :ref具有唯一性调用 : this.$refs.alert.子组件方法还可以获取data数据同上二...

任务组件HangFire

HangFire 文档地址:https://docs.hangfire.io/en/latest/getting-started/index.html HangFire类似Quartz.NET的任务...