mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-17 02:31:34 +08:00
fix(vue): ensure dynamic classes are synced with internal Ionic component classes (#22096)
resolves #22051
This commit is contained in:
8
core/package-lock.json
generated
8
core/package-lock.json
generated
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@ionic/core",
|
||||
"version": "5.4.0-dev.202009101933.5ffa65f",
|
||||
"version": "5.4.0-dev.202009151947.352e16b",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@ -1385,9 +1385,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"@stencil/vue-output-target": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.1.2.tgz",
|
||||
"integrity": "sha512-UgaDR1PHqWO5XE41NK6YGj3IZLfnZQry0mxilnMHEegCdhp7dMrG4VaRw35BFbgnL9rRYJ0xvpergYkoT946uA==",
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.1.3.tgz",
|
||||
"integrity": "sha512-+X1/gjiHh88Q+sQ9EWEHb4PIQs0k4pjTYxqsjqF5Yq9oaQGOPoKzOzjiIs2PEcE0fB6yu/dtRNQUUsBo613dpA==",
|
||||
"dev": true
|
||||
},
|
||||
"@stylelint/postcss-css-in-js": {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@ionic/core",
|
||||
"version": "5.4.0-dev.202009101933.5ffa65f",
|
||||
"version": "5.4.0-dev.202009151947.352e16b",
|
||||
"description": "Base components for Ionic",
|
||||
"keywords": [
|
||||
"ionic",
|
||||
@ -38,7 +38,7 @@
|
||||
"@rollup/plugin-virtual": "^2.0.3",
|
||||
"@stencil/core": "1.17.3",
|
||||
"@stencil/sass": "1.3.2",
|
||||
"@stencil/vue-output-target": "0.1.2",
|
||||
"@stencil/vue-output-target": "0.1.3",
|
||||
"@types/jest": "^26.0.10",
|
||||
"@types/node": "^14.6.0",
|
||||
"@types/puppeteer": "3.0.1",
|
||||
|
@ -20,9 +20,13 @@ interface ComponentOptions {
|
||||
routerLinkComponent?: boolean;
|
||||
}
|
||||
|
||||
const getElementClasses = (ref: Ref<HTMLElement | undefined>, componentClasses: string[], defaultClasses: string[] = []) => {
|
||||
const getComponentClasses = (classes: unknown) => {
|
||||
return (classes as string)?.split(' ') || [];
|
||||
};
|
||||
|
||||
const getElementClasses = (ref: Ref<HTMLElement | undefined>, componentClasses: Set<string>, defaultClasses: string[] = []) => {
|
||||
return [ ...Array.from(ref.value?.classList || []), ...defaultClasses ]
|
||||
.filter((c: string, i, self) => !componentClasses.includes(c) && self.indexOf(c) === i);
|
||||
.filter((c: string, i, self) => !componentClasses.has(c) && self.indexOf(c) === i);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -47,7 +51,7 @@ export const defineContainer = <Props extends object>(name: string, componentPro
|
||||
const Container: FunctionalComponent<Props & InputProps> = defineComponent((props, { attrs, slots, emit }) => {
|
||||
const { modelValue, ...restOfProps } = props;
|
||||
const containerRef = ref<HTMLElement>();
|
||||
const classes: string[] = (attrs.class as string)?.split(' ') || [];
|
||||
const classes = new Set(getComponentClasses(attrs.class));
|
||||
const onVnodeBeforeMount = (vnode: VNode) => {
|
||||
// Add a listener to tell Vue to update the v-model
|
||||
if (vnode.el) {
|
||||
@ -86,6 +90,10 @@ export const defineContainer = <Props extends object>(name: string, componentPro
|
||||
}
|
||||
|
||||
return () => {
|
||||
getComponentClasses(attrs.class).forEach(value => {
|
||||
classes.add(value);
|
||||
});
|
||||
|
||||
let propsToAdd = {
|
||||
...finalProps,
|
||||
ref: containerRef,
|
||||
|
Reference in New Issue
Block a user