慕田峪9158850
2022-12-18 16:07:16
我正在嘗試通過映射數組來動態創建和更改組件的值。最初一切正常(當我通過默認值映射時),直到我到達應該設置屬性的 setPadding 函數。然后我的數組被更改為對象,使第二個映射拋出錯誤 - react-dom.min.js?ver=16.9.0:103 TypeError: attributes.padding.map is not a function。這是代碼:屬性:padding: { type: 'array', default: [ { name: 'top', image: `${ url }images/padding-top.svg`, v: 10, }, { name: 'bottom', image: `${ url }images/padding-bottom.svg`, v: 10, }, ],},組件渲染(注意attribiutes.padding被映射 - 這適用于默認值):<PanelBody title="Test" initialOpen={ true }> { attributes.padding.map( ( attr ) => ( <div className="component-row-wrapper margin-padding"> <PanelRow> <RangeControl label={ <img src={ attr.image } alt="" /> } value={ attr.v } onChange={ ( value ) => setPadding( attr.name, value ) } min={ 0 } max={ 300 } /> </PanelRow> </div> ), ) }</PanelBody>最后是setPadding函數(console.log在函數本身之前——它被放置在edit( props )組件渲染和組件渲染之間):console.log( attributes.padding ); // initially it works fine, after setPadding it logs object instead of array.const setPadding = ( name, value ) => { const paddingAttr = attributes.padding; {paddingAttr.map( r => { if ( name === r.name ) { r.v = value; } } );} console.log( paddingAttr ); // works fine, being displayed as array every time! props.setAttributes( { padding: { paddingAttr }, // saves 'padding' attribute as object 'paddingAttr: Array(2)...' instead of array ?? } );};我在這里做錯了什么?非常感謝你!
2 回答

皈依舞
TA貢獻1851條經驗 獲得超3個贊
在你調用的地方props.setAttributes,屬性是一個對象的原因是因為你正在創建一個對象!您需要以下內容:
props.setAttributes( {
padding: paddingAttr
} );
在MDN上閱讀有關屬性速記符號的更多信息。
此外,正如我所說,您需要修復對Array#map. 將其更改為以下內容:
paddingAttr = paddingAttr.map( r => {
if ( name === r.name ) {
r.v = value;
}
return r;
} );

慕妹3146593
TA貢獻1820條經驗 獲得超9個贊
{paddingAttr.map( r => {
if ( name === r.name ) {
r.v = value;
}
} );}
這里,(TypeError的原因:attributes.padding.map is not a function),paddingAttr不是數組,改成
{paddingAttr.default.map( r => {
if ( name === r.name ) {
r.v = value;
}
} );}
添加回答
舉報
0/150
提交
取消