mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-25 02:41:46 +08:00
feat(Sku): auto center in largeImageMode (#6633)
* feat(Sku): 大图模式下支持自动定位到选中 * fix(Sku): 修改居中实现 Co-authored-by: songweite <songweite@youzan.com>
This commit is contained in:
parent
fb26960336
commit
ab5a665387
@ -430,6 +430,8 @@ export default createComponent({
|
|||||||
selectedProp: this.selectedProp,
|
selectedProp: this.selectedProp,
|
||||||
selectedSkuComb: this.selectedSkuComb,
|
selectedSkuComb: this.selectedSkuComb,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.centerInitialSku();
|
||||||
},
|
},
|
||||||
|
|
||||||
getSkuMessages() {
|
getSkuMessages() {
|
||||||
@ -605,6 +607,18 @@ export default createComponent({
|
|||||||
selectedSkuComb: this.selectedSkuComb,
|
selectedSkuComb: this.selectedSkuComb,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 当 popup 完全打开后执行
|
||||||
|
onOpened() {
|
||||||
|
this.centerInitialSku();
|
||||||
|
},
|
||||||
|
|
||||||
|
centerInitialSku() {
|
||||||
|
(this.$refs.skuRows || []).forEach((it) => {
|
||||||
|
const { k_s } = it.skuRow || {};
|
||||||
|
it.centerItem(this.initialSku[k_s]);
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -681,7 +695,7 @@ export default createComponent({
|
|||||||
(this.hasSkuOrAttr && (
|
(this.hasSkuOrAttr && (
|
||||||
<div class={this.skuGroupClass}>
|
<div class={this.skuGroupClass}>
|
||||||
{this.skuTree.map((skuTreeItem) => (
|
{this.skuTree.map((skuTreeItem) => (
|
||||||
<SkuRow skuRow={skuTreeItem}>
|
<SkuRow skuRow={skuTreeItem} ref="skuRows" refInFor>
|
||||||
{skuTreeItem.v.map((skuValue) => (
|
{skuTreeItem.v.map((skuValue) => (
|
||||||
<SkuRowItem
|
<SkuRowItem
|
||||||
skuList={sku.list}
|
skuList={sku.list}
|
||||||
@ -759,6 +773,7 @@ export default createComponent({
|
|||||||
getContainer={this.getContainer}
|
getContainer={this.getContainer}
|
||||||
closeOnClickOverlay={this.closeOnClickOverlay}
|
closeOnClickOverlay={this.closeOnClickOverlay}
|
||||||
safeAreaInsetBottom={this.safeAreaInsetBottom}
|
safeAreaInsetBottom={this.safeAreaInsetBottom}
|
||||||
|
onOpened={this.onOpened}
|
||||||
>
|
>
|
||||||
{Header}
|
{Header}
|
||||||
<div class="van-sku-body" style={this.bodyStyle}>
|
<div class="van-sku-body" style={this.bodyStyle}>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
// Utils
|
// Utils
|
||||||
import { createNamespace } from '../../utils';
|
import { createNamespace } from '../../utils';
|
||||||
import { BORDER_BOTTOM } from '../../utils/constant';
|
import { BORDER_BOTTOM } from '../../utils/constant';
|
||||||
|
// Mixins
|
||||||
|
import { ParentMixin } from '../../mixins/relation';
|
||||||
import { BindEventMixin } from '../../mixins/bind-event';
|
import { BindEventMixin } from '../../mixins/bind-event';
|
||||||
|
|
||||||
const [createComponent, bem, t] = createNamespace('sku-row');
|
const [createComponent, bem, t] = createNamespace('sku-row');
|
||||||
@ -9,6 +11,7 @@ export { bem };
|
|||||||
|
|
||||||
export default createComponent({
|
export default createComponent({
|
||||||
mixins: [
|
mixins: [
|
||||||
|
ParentMixin('vanSkuRows'),
|
||||||
BindEventMixin(function (bind) {
|
BindEventMixin(function (bind) {
|
||||||
if (this.scrollable && this.$refs.scroller) {
|
if (this.scrollable && this.$refs.scroller) {
|
||||||
bind(this.$refs.scroller, 'scroll', this.onScroll);
|
bind(this.$refs.scroller, 'scroll', this.onScroll);
|
||||||
@ -90,6 +93,21 @@ export default createComponent({
|
|||||||
|
|
||||||
return nodes;
|
return nodes;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
centerItem(selectSkuId) {
|
||||||
|
if (!this.skuRow.largeImageMode || !selectSkuId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { children = [] } = this;
|
||||||
|
const { scroller, row } = this.$refs;
|
||||||
|
const child = children.find((it) => +it.skuValue.id === +selectSkuId);
|
||||||
|
if (scroller && row && child && child.$el) {
|
||||||
|
const target = child.$el;
|
||||||
|
const to =
|
||||||
|
target.offsetLeft - (scroller.offsetWidth - target.offsetWidth) / 2;
|
||||||
|
scroller.scrollLeft = to;
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
import { bem } from './SkuRow';
|
import { bem } from './SkuRow';
|
||||||
import { createNamespace } from '../../utils';
|
import { createNamespace } from '../../utils';
|
||||||
import { isSkuChoosable } from '../utils/sku-helper';
|
import { isSkuChoosable } from '../utils/sku-helper';
|
||||||
|
import { ChildrenMixin } from '../../mixins/relation';
|
||||||
import Image from '../../image';
|
import Image from '../../image';
|
||||||
|
|
||||||
const [createComponent] = createNamespace('sku-row-item');
|
const [createComponent] = createNamespace('sku-row-item');
|
||||||
|
|
||||||
export default createComponent({
|
export default createComponent({
|
||||||
|
mixins: [ChildrenMixin('vanSkuRows')],
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
lazyLoad: Boolean,
|
lazyLoad: Boolean,
|
||||||
skuValue: Object,
|
skuValue: Object,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user