The AbstractRepeater is a base component designed for flexible data handling where you need to manage state externally, such as with WordPress Post Meta or custom stores. Unlike the standard Repeater, which is tied to block attributes, AbstractRepeater uses value and onChange props to control its data.
This is the preferred method when implementing drag-and-drop reordering or when working with data stored in the REST API via core/data.
import { AbstractRepeater } from './AbstractRepeater';
import { useDispatch, useSelect } from '@wordpress/data';
import { store as coreStore } from '@wordpress/core-data';
export function Edit() {
const { postId, metaValue } = useSelect((select) => ({
postId: select('core/editor').getCurrentPostId(),
metaValue: select(coreStore).getEditedEntityRecord('postType', 'post', postId)?.meta?.alternative_titles || []
}));
const { editEntityRecord } = useDispatch(coreStore);
const updateMeta = (newValue) => {
editEntityRecord('postType', 'post', postId, {
meta: { alternative_titles: newValue }
});
};
return (
<AbstractRepeater
onChange={updateMeta}
value={metaValue}
allowReordering={true}
>
{(item, index, setItem, removeItem) => (
<TextControl
value={item}
onChange={setItem}
placeholder={__('Add alternative title...', 'text-domain')}
onRemove={removeItem}
/>
)}
</AbstractRepeater>
);
}