Browse Source

fix(vc-slick): #6100 - Fix content responsiveness in carousel component slot. (#6149)

* fix(vc-slick): #6100 - Fix content responsiveness in carousel component slot.

* feat(_util) add deepCloneElement function
pull/6152/merge
M.Wang 2 years ago committed by GitHub
parent
commit
8a0c8a8fb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      components/_util/vnode.ts
  2. 10
      components/vc-slick/track.jsx

22
components/_util/vnode.ts

@ -3,11 +3,12 @@ import type { VNode, VNodeProps } from 'vue';
import { cloneVNode } from 'vue'; import { cloneVNode } from 'vue';
import warning from './warning'; import warning from './warning';
import type { RefObject } from './createRef'; import type { RefObject } from './createRef';
type NodeProps = Record<string, any> &
Omit<VNodeProps, 'ref'> & { ref?: VNodeProps['ref'] | RefObject };
export function cloneElement<T, U>( export function cloneElement<T, U>(
vnode: VNode<T, U> | VNode<T, U>[], vnode: VNode<T, U> | VNode<T, U>[],
nodeProps: Record<string, any> & nodeProps: NodeProps = {},
Omit<VNodeProps, 'ref'> & { ref?: VNodeProps['ref'] | RefObject } = {},
override = true, override = true,
mergeRef = false, mergeRef = false,
): VNode<T, U> { ): VNode<T, U> {
@ -29,3 +30,20 @@ export function cloneElement<T, U>(
export function cloneVNodes(vnodes, nodeProps = {}, override = true) { export function cloneVNodes(vnodes, nodeProps = {}, override = true) {
return vnodes.map(vnode => cloneElement(vnode, nodeProps, override)); return vnodes.map(vnode => cloneElement(vnode, nodeProps, override));
} }
export function deepCloneElement<T, U>(
vnode: VNode<T, U> | VNode<T, U>[],
nodeProps: NodeProps = {},
override = true,
mergeRef = false,
) {
if (Array.isArray(vnode)) {
return vnode.map(item => deepCloneElement(item, nodeProps, override, mergeRef));
} else {
const cloned = cloneElement(vnode, nodeProps, override, mergeRef);
if (Array.isArray(cloned.children)) {
cloned.children = deepCloneElement(cloned.children as VNode<T, U>[]);
}
return cloned;
}
}

10
components/vc-slick/track.jsx

@ -1,8 +1,8 @@
import { createVNode } from 'vue'; import { createVNode } from 'vue';
import classnames from '../_util/classNames'; import classnames from '../_util/classNames';
import { cloneElement } from '../_util/vnode';
import { flattenChildren } from '../_util/props-util'; import { flattenChildren } from '../_util/props-util';
import { lazyStartIndex, lazyEndIndex, getPreClones } from './utils/innerSliderUtils'; import { lazyStartIndex, lazyEndIndex, getPreClones } from './utils/innerSliderUtils';
import { deepCloneElement } from '../_util/vnode';
// given specifications/props for a slide, fetch all the classes that need to be applied to the slide // given specifications/props for a slide, fetch all the classes that need to be applied to the slide
const getSlideClasses = spec => { const getSlideClasses = spec => {
@ -84,7 +84,6 @@ const renderSlides = function (spec, children) {
const childrenCount = children.length; const childrenCount = children.length;
const startIndex = lazyStartIndex(spec); const startIndex = lazyStartIndex(spec);
const endIndex = lazyEndIndex(spec); const endIndex = lazyEndIndex(spec);
children.forEach((elem, index) => { children.forEach((elem, index) => {
let child; let child;
const childOnClickOptions = { const childOnClickOptions = {
@ -105,7 +104,7 @@ const renderSlides = function (spec, children) {
let slideClasses = getSlideClasses({ ...spec, index }); let slideClasses = getSlideClasses({ ...spec, index });
// push a cloned element of the desired slide // push a cloned element of the desired slide
slides.push( slides.push(
cloneElement(child, { deepCloneElement(child, {
key: 'original' + getKey(child, index), key: 'original' + getKey(child, index),
tabindex: '-1', tabindex: '-1',
'data-index': index, 'data-index': index,
@ -131,7 +130,7 @@ const renderSlides = function (spec, children) {
} }
slideClasses = getSlideClasses({ ...spec, index: key }); slideClasses = getSlideClasses({ ...spec, index: key });
preCloneSlides.push( preCloneSlides.push(
cloneElement(child, { deepCloneElement(child, {
key: 'precloned' + getKey(child, key), key: 'precloned' + getKey(child, key),
class: classnames(slideClasses, slideClass), class: classnames(slideClasses, slideClass),
tabindex: '-1', tabindex: '-1',
@ -155,7 +154,7 @@ const renderSlides = function (spec, children) {
} }
slideClasses = getSlideClasses({ ...spec, index: key }); slideClasses = getSlideClasses({ ...spec, index: key });
postCloneSlides.push( postCloneSlides.push(
cloneElement(child, { deepCloneElement(child, {
key: 'postcloned' + getKey(child, key), key: 'postcloned' + getKey(child, key),
tabindex: '-1', tabindex: '-1',
'data-index': key, 'data-index': key,
@ -182,6 +181,7 @@ const renderSlides = function (spec, children) {
const Track = (_, { attrs, slots }) => { const Track = (_, { attrs, slots }) => {
const slides = renderSlides(attrs, flattenChildren(slots?.default())); const slides = renderSlides(attrs, flattenChildren(slots?.default()));
// const slides = renderSlides(attrs, slots?.default);
const { onMouseenter, onMouseover, onMouseleave } = attrs; const { onMouseenter, onMouseover, onMouseleave } = attrs;
const mouseEvents = { onMouseenter, onMouseover, onMouseleave }; const mouseEvents = { onMouseenter, onMouseover, onMouseleave };
const trackProps = { const trackProps = {

Loading…
Cancel
Save