cqwcns 发表于 2023-11-27 10:36

通过浏览器控制台JavaScript操作element-plus元素的问题

WEB前端,网页中现有一个由vue3+element-plus创建的el-select元素,代码如下:
<div class="el-select el-select--small"><!----><div class="el-input el-input--small el-input--suffix"><!----><input type="text" readonly="readonly" autocomplete="off" placeholder="请选择" class="el-input__inner"><!----><span class="el-input__suffix"><span class="el-input__suffix-inner"><i class="el-select__caret el-input__icon el-icon-arrow-up"></i><!----><!----><!----><!----><!----></span><!----></span><!----><!----></div></div>

该元素(.el-select)的元素的XPath为:
/html/body/div/div/div/form/div/div/div

注意,以上元素不是我写的,是网页中现有的。

现在我要在浏览器控制台,通过javascript为这个el-select赋值为"日班",我尝试这样写:
let sElement = document.evaluate(`/html/body/div/div/div/form/div/div/div`, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

sElement.value = '日班';

sElement.dispatchEvent(new Event('input', { bubbles: true }));

但没有成功。


所以,如果要通过浏览器控制台javascript更新el-select,应该怎么?

7593454 发表于 2023-11-27 10:49

gpt:

Vue.js 使用虚拟 DOM 来管理页面上的元素,因此直接通过 JavaScript 更改 DOM 元素的 value 并不会触发 Vue 的更新机制。相反,你需要找到 Vue 实例,然后更改其数据模型中与 el-select 绑定的属性。

在 Vue 3 中,可以通过组件的根 DOM 元素访问到组件实例。但是,从外部访问 Vue 实例的状态并不是 Vue 推荐的做法,因为这可能会破坏 Vue 的响应式系统和组件封装。

不过,如果你确实需要这么做,可以尝试以下步骤:

找到 el-select 组件对应的 Vue 实例。
修改这个实例中的数据属性,这个属性应该与 el-select 绑定。
触发 Vue 的更新周期。
这里是一个可能的方法来实现这个操作:

// 获取 el-select 组件的 DOM 元素
let sElement = document.evaluate('/html/body/div/div/div/form/div/div/div', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// 尝试获取 Vue 组件实例
let vueComponentInstance = sElement.__vue__;

if (vueComponentInstance) {
    // 假设 el-select 绑定的是 modelValue,这个名字可能在你的组件中不同
    vueComponentInstance.modelValue = '日班';

    // 触发更新
    vueComponentInstance.$forceUpdate();

    // 如果 el-select 绑定的是一个计算属性或者方法,你可能需要调用这个方法
    // vueComponentInstance.someMethod('日班');
} else {
    console.error('无法找到 Vue 组件实例');
}
请注意,__vue__ 是一个非官方的属性,可能在未来的 Vue 版本中不可用,而且它通常只在开发模式下可用。如果你无法通过 __vue__ 获取实例,可能需要使用其他方法来获取实例,或者直接在 Vue 应用内部设置一个方法或者事件来更新数据。

如果你有权访问原始的 Vue 代码,最好的做法是创建一个方法或者自定义事件,然后在控制台中调用这个方法或者触发这个事件来更新数据。这样可以避免绕过 Vue 的响应式系统,同时保持代码的清晰和可维护性。

Pwaerm 发表于 2023-11-27 11:38

function setInputValue(element, value) {
    let lastValue = element.value;
    element.value = value;
    let event = new Event('input', { bubbles: true });
    event.simulated = true;
    let tracker = element._valueTracker;
    if (tracker) {
      tracker.setValue(lastValue);
    }
    element.dispatchEvent(event);
}

试试看

虚伪 发表于 2023-11-27 11:44

楼主还不如把网址po出来这样就不需要发一个测试一个。

好听吗 发表于 2023-11-27 13:48

修改 element ui 的相关组件 光修改 input 或者 select 是不行的,还需要拿到vnode 属性,然后通过$on方法监听 change 事件,在监听事件内部使用 $emit('input', xxx) 来动态修改值

例如
componentInstance.$on('change', e =>componentInstance.$emit('input', xxx))
页: [1]
查看完整版本: 通过浏览器控制台JavaScript操作element-plus元素的问题