From a37be755a7ac6e98d18e17e2a626ce0604427f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9C=E5=AD=9C?= <1183048003@qq.com> Date: Mon, 25 Sep 2023 10:06:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(Cascader):=20=E4=BF=AE=E5=A4=8D=20`change`?= =?UTF-8?q?=20=E4=BA=8B=E4=BB=B6=E8=A2=AB=E8=A7=A6=E5=8F=91=E4=B8=A4?= =?UTF-8?q?=E6=AC=A1=E5=92=8C=20`v-model`=20=E6=B2=A1=E6=9C=89=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E5=BC=8F=E7=9A=84=E9=97=AE=E9=A2=98=20(#1096)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: fix(cascader): 修复变更选项触发两次onchange事件和v-model绑定ref()没有响应式问题 fix(cascader): 修复变更选项触发两次onchange事件和v-model绑定ref()没有响应式问题 #1086 * fix: fix(cascader): 修复变更选项触发两次onchange事件和v-model绑定ref()没有响应式问题 fix(cascader): 修复变更选项触发两次onchange事件和v-model绑定ref()没有响应式问题 * fix: fix(cascader): 修复变更选项触发两次onchange事件和v-model绑定ref()没有响应式问 题 fix(cascader): 修复变更选项触发两次onchange事件和v-model绑定ref()没有响应式问 题 --- src/cascader/cascader.vue | 3 +-- src/shared/useVModel/index.ts | 15 +++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cascader/cascader.vue b/src/cascader/cascader.vue index 7b456bd65..77d6b3d70 100644 --- a/src/cascader/cascader.vue +++ b/src/cascader/cascader.vue @@ -218,8 +218,7 @@ export default defineComponent({ childrenInfo.value = e; childrenInfo.level = level; } else { - setCascaderValue(item[(keys as Ref).value?.value ?? 'value']); - props.onChange?.( + setCascaderValue( item[(keys as Ref).value?.value ?? 'value'], items.map((item, index) => toRaw(item?.[selectedIndexes[index]])), ); diff --git a/src/shared/useVModel/index.ts b/src/shared/useVModel/index.ts index ab3a701d9..4835e0d4a 100644 --- a/src/shared/useVModel/index.ts +++ b/src/shared/useVModel/index.ts @@ -1,4 +1,5 @@ import { ref, Ref, getCurrentInstance, ComponentInternalInstance } from 'vue'; +import kebabCase from 'lodash/kebabCase'; export type ChangeHandler = (value: T, ...args: any[]) => void; @@ -10,12 +11,18 @@ export function useVModel( propName = 'value', // emit 和 eventName 用于支持 v-model 和 xxx.sync 语法糖 ): [Ref, ChangeHandler] { - const { emit } = getCurrentInstance() as ComponentInternalInstance; + const { emit, vnode } = getCurrentInstance() as ComponentInternalInstance; const internalValue = ref() as Ref; internalValue.value = defaultValue; - + const vProps = vnode.props || {}; + const isVM = + Object.prototype.hasOwnProperty.call(vProps, 'modelValue') || + Object.prototype.hasOwnProperty.call(vProps, 'model-value'); + const isVMP = + Object.prototype.hasOwnProperty.call(vProps, propName) || + Object.prototype.hasOwnProperty.call(vProps, kebabCase(propName)); // 受控模式 v-model:propName - if (typeof value.value !== 'undefined') { + if (isVMP || typeof value.value !== 'undefined') { return [ value, (newValue, ...args) => { @@ -26,7 +33,7 @@ export function useVModel( } // 受控模式:modelValue v-model - if (typeof modelValue.value !== 'undefined') { + if (isVM || typeof modelValue.value !== 'undefined') { return [ modelValue, (newValue, ...args) => {