在 React(WordPress 块编辑器)中使用 setAttributes 设置属性后,我得到对象而不是数组。我的代码有什么问题?
I get object instead of array after setting an attribute with setAttributes in React (WordPress Block Editor). What's wrong with my code?
我正在尝试通过映射数组来动态创建和更改组件的值。最初一切正常(当我通过默认值映射时),直到我到达应该设置属性的 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 ??
} );
};
我做错了什么?
非常感谢!
{paddingAttr.map( r => {
if ( name === r.name ) {
r.v = value;
}
} );}
这里,(TypeError的原因:attributes.padding.map不是函数),paddingAttr不是数组,改成
{paddingAttr.default.map( r => {
if ( name === r.name ) {
r.v = value;
}
} );}
你在哪里调用props.setAttributes
,属性是一个对象的原因是因为你正在创建一个对象!您需要以下内容:
props.setAttributes( {
padding: paddingAttr
} );
阅读有关 属性 shorthand 符号的更多信息 MDN。
此外,正如我所说,您需要修复对 Array#map
的调用。将其更改为以下内容:
paddingAttr = paddingAttr.map( r => {
if ( name === r.name ) {
r.v = value;
}
return r;
} );
我正在尝试通过映射数组来动态创建和更改组件的值。最初一切正常(当我通过默认值映射时),直到我到达应该设置属性的 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 ??
} );
};
我做错了什么?
非常感谢!
{paddingAttr.map( r => {
if ( name === r.name ) {
r.v = value;
}
} );}
这里,(TypeError的原因:attributes.padding.map不是函数),paddingAttr不是数组,改成
{paddingAttr.default.map( r => {
if ( name === r.name ) {
r.v = value;
}
} );}
你在哪里调用props.setAttributes
,属性是一个对象的原因是因为你正在创建一个对象!您需要以下内容:
props.setAttributes( {
padding: paddingAttr
} );
阅读有关 属性 shorthand 符号的更多信息 MDN。
此外,正如我所说,您需要修复对 Array#map
的调用。将其更改为以下内容:
paddingAttr = paddingAttr.map( r => {
if ( name === r.name ) {
r.v = value;
}
return r;
} );