You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Component中父子组件间如何传递数据?

解决方案:将select选中索引传递给自定义元素converter-input

你的核心问题是拿到select的selectedIndex并获取目标数组后,没有将数据传递给<converter-input>子组件,以下是具体的修复步骤:

1. 修改index.js,传递数据给子组件

先获取页面上的两个<converter-input>实例,在selectUnit函数中将选中的数组传递给它们,这里用自定义属性的方式实现:

// 获取页面上所有converter-input元素
const converterInputs = document.querySelectorAll('converter-input');

if(mainForm){
    mainForm.addEventListener('change' , () =>{
        let i = mainForm.selectedIndex;
        selectUnit(i);
    })
}

function selectUnit(i){
    // 修正原代码拼写错误:selsected -> selected
    const selectedConverterArr = mainOb[i].unit;
    console.log(selectedConverterArr);
    
    // 将选中的数组传递给每个converter-input子组件
    converterInputs.forEach(input => {
        // 用dataset传递数组,需转为JSON字符串
        input.dataset.units = JSON.stringify(selectedConverterArr);
    });
}

2. 实现converter-input子组件的更新逻辑

你的<converter-input>是自定义元素,需要在它的类定义里监听属性变化,根据传入的数组更新显示内容:

class ConverterInput extends HTMLElement {
    constructor() {
        super();
        // 初始化元素结构
    }

    // 声明需要监听的属性
    static get observedAttributes() {
        return ['data-units'];
    }

    // 属性变化时触发的回调
    attributeChangedCallback(name, oldValue, newValue) {
        if (name === 'data-units' && newValue) {
            const units = JSON.parse(newValue);
            this.renderUnits(units);
        }
    }

    // 根据传入的数组渲染内容(示例为生成select选项)
    renderUnits(units) {
        this.innerHTML = `
            <select class="unit-select form-control">
                ${units.map(unit => `<option value="${unit.value}">${unit.label}</option>`).join('')}
            </select>
        `;
    }
}

// 注册自定义元素
customElements.define('converter-input', ConverterInput);

可选方案:用自定义事件传递数据

如果不想用属性传递,也可以通过自定义事件实现:

// 在selectUnit函数中触发事件
function selectUnit(i){
    const selectedConverterArr = mainOb[i].unit;
    const updateEvent = new CustomEvent('units-updated', { detail: selectedConverterArr });
    converterInputs.forEach(input => input.dispatchEvent(updateEvent));
}

// 在converter-input类中监听事件
class ConverterInput extends HTMLElement {
    constructor() {
        super();
        this.addEventListener('units-updated', (e) => {
            this.renderUnits(e.detail);
        });
    }

    renderUnits(units) {
        // 渲染逻辑同上
    }
}

内容的提问来源于stack exchange,提问作者fatemeh garshasbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:06:32