父元件中有一個表單日期元件,子元件是一個彈層(彈層中有日期元件,預設值取父元件選中的日期),父元件更改日期範圍後,子元件開啟預設日期也需要更新。如下:
// 父元件
<template>
<div>
<date-span style="flex-grow: 1" ref="dateSpanE" :noCache="true" :startDate="startDate"
:endDate="endDate" type="weekrange" @change="changeDate"></date-span>
<!-- 子彈層元件 -->
<ActiveTakeEffect ref="activeModal" :timeRange="makeActiveTime" />
</div>
</template>
<script>
import DateSpan from '@/components/DateSpanE'
export default {
components: { DateSpan },
// ...
data: () => {
return {
makeActiveTime: {
startDate: '',
endDate: ''
},
}
},
computed: {
startDate() {
return this.makeActiveTime.startDate
},
endDate() {
return this.makeActiveTime.endDate
}
},
methods: {
// 父元件表單日期修改時更新了傳入的日期
changeDate(dateInfo) {
const { start: startDate, end: endDate } = dateInfo
this.makeActiveTime = {
startDate,
endDate
}
}
}
}
</script>
// 子元件
<template>
<Modal v-model="showModal" width="680" title="XXX" :mask-closable="false" @on-visible-change="visibleChange"
:loading="loading">
<div class="single-effect-modal">
<div class="form-wrapper">
<date-span style="flex-grow: 1" ref="dateSpanE" :noCache="true" :startDate="startDate" :endDate="endDate"
type="weekrange" @change="changeDate"></date-span>
</div>
</div>
</Modal>
</template>
<script>
import Api from '@/api_axios'
import DateSpan from '@/components/DateSpanE'
import { formatDate } from '@/common/util'
import moment from 'moment'
export default {
components: {
DateSpan
},
props: {
// 定義父元件傳入的prop
timeRange: {
type: Object,
default: () => {
return {
startDate: new Date(),
endDate: moment().add(17, 'w').toDate()
}
}
}
},
data() {
return {
loading: true,
showModal: false,
// data中定義子元件日期範圍元件所需的展示資料,預設取props中定義的值
timeRangeFromProps: this.timeRange
}
},
computed: {
startDate() {
return this.timeRangeFromProps.startDate
},
endDate() {
return this.timeRangeFromProps.endDate
}
},
watch: {
// 監聽傳入的props值,props值更改時更新子元件資料
// 若無此監聽,父元件修改日期後,子元件的日期範圍得不到更新
timeRange() {
this.timeRangeFromProps = this.timeRange
}
},
methods: {
changeDate(dateInfo) {
const { start: startDate, end: endDate } = dateInfo
this.timeRangeFromProps = {
startDate,
endDate
}
},
toggle(isShow) {
this.showModal = isShow
},
// ...
}
}
</script>
<style lang="less">
.single-effect-modal {
.form-wrapper {
min-height: 100px;
}
.item-label {
min-width: 60px;
}
}
</style>
$parent
$refs
$emit
$refs
存取子元件中的方法或屬性<ActiveTakeEffect ref="activeModal" :timeRange="makeActiveTime" />
<script>
this.$refs.activeModal.timeRangeFromProps // timeRangeFromProps是子元件中的屬性
this.$refs.activeModal.toggle(true) // toggle是子元件中的方法名
</script>
$parent
存取父元件中的方法或屬性 $emit
觸發父元件中定義的方法// 子元件
<script>
this.$parent.makeActiveTime // makeActiveTime是父元件中的屬性
this.$parent.changeDate({startDate:xxx, endDate: xxx}) // changeDate是父元件中的方法名
</script>
// 父元件,忽略其他項
<date-span @conditionChange="conditionChange"></date-span>
<scipt>
// ...
methods: {
conditionChange(controlName) {
// ...
}
}
// ...
</script>
<script>
// 子元件中呼叫
this.$emit('conditionChange', 'dateSpan')
</script>
// itemList就是來自treeSelectMixin中定義的資料
<SwitchButton :itemList="itemList" @change="toggleSelectAll"></SwitchButton>
<script>
import mixin from './treeSelectMixin'
export default {
mixins: [mixin],
components: {
Treeselect,
SwitchButton
},
// ...
}
</script>
// 同一個.vue檔案中可以出現以下兩個style標籤
<style lang="less">
</style>
// 當 `<style>` 標籤有 `scoped` 屬性時,它的 CSS 只作用於當前元件中的元素。
<style lang="less" scoped>
</style>
以上就是入門時困擾較多的地方~祝換乘順利
作者:京東保險 黃曉麗
來源:京東雲開發者社群 轉載請註明來源