vue组件抽离的写法(数据传输)

一直看网上说有两种,我就直接使用注册组件这一种
组件之间涉及到的数据传输,大致分为这几种:

父传子(某页面传给公共组件):

比如,对于不同的页面,头部的中间内容title可能都不一样:
(父通过属性传递,子通过prop接收)
子组件

<template>
    <div class="header">
        <slot name="left"></slot>
        <span class="header_title">
            <span class="header_title_text ellipsis">{{ title }}</span>
        </span>
        <slot name="right"></slot>
    </div>
</template>

<script>
export default {
  name: 'HeaderTop',
  props: {
    title: String
  }
}
</script>

父组件

<template>
    <div class="profile">
        <HeaderTop title="个人中心"></HeaderTop>
    </div>
</template>

<script>
import HeaderTop from '../../components/HeaderTop/HeaderTop.vue'

export default {
  name: 'Profile',
  components: {
    HeaderTop
  }
}
</script>

子传父(公共组件传给某页面):

子组件:

<template>
<view class="input">
	<input class="search-input" style="border: none;" @input="input" />
</view>
</template>
<script>
import HeaderTop from '../../components/HeaderTop/HeaderTop.vue'

export default {
	methods:{
		input(e) {
				let value = e.detail.value;
				this.$emit('get-input-value', value);
			}
}
}
</script>

父组件:

<template>
    <div class="profile">
        <qjFuzzySearch class="input" @get-input-value="getInputValue" v-model="queryData.giftName" @confirm-value="confirmValue">
				</qjFuzzySearch>
    </div>
</template>

<script>
import qjFuzzySearch from '@/components/qj-fuzzy-search/qj-fuzzy-search.vue'

export default {
  components: {
    qjFuzzySearch
  },
  methods:{
  	getInputValue(e) {
		this.queryData.giftName = e;
		debounce(this.getList, 500); //防抖 如果在项目中使用了uview-ui 则直接调用uview封装的防抖方法即可
			}, // 通过子组件输入的值,发送请求,进行查询,获取列表
  }
}
</script>

插槽slot

子组件:

<!--首页头部-->
<template>
  <header class="header">
  <!--3.插槽1,name:left-->
    <slot name="left"></slot>
    <span class="header_title">
    <!--1.接收父组件传值,名为title-->
      <span class="header_title_text ellipsis">{{title}}</span>
    </span>
    <!--4.插槽2,name:right-->
    <slot name="right"></slot>
  </header>
</template>

<script>
  export default {
  //2.接收父组件传的值为title,类型为String
    props:{
      title:String
    }
  }
</script>

父组件:

<!--首页头部-->
		<!--0.用title向子组件传值-->
        <TopHeader title='首页-昌平区北七家宏福科技园(337省道北)'>
        <!--1.使用插槽:左-->
	        <span class="header_search" slot='left'>
	            <i class="iconfont icon-sousuo"></i>
	        </span>
	     <!--2.使用插槽:右-->
	        <span class="header_login" slot='right'>
            	<span class="header_login_text">登录|注册</span>
          	</span>
        </TopHeader>

更多欢迎补充......

参考:
https://www.cnblogs.com/chenxi188/p/13940371.html?ivk_sa=1024320u
https://blog.csdn.net/weixin_42614080/article/details/104041392

posted @ 2022-03-22 10:52  黑蛋的博客  阅读(250)  评论(0编辑  收藏  举报