У меня есть текстовый компонент со следующим кодом
return (
<FormControl variant = "outlined" className = {classes.formControl}>
<Grid container>
<TextField
id = {props.id}
label = {props.label}
defaultValue = {props.defaultValue || ""}
variant = "outlined"
/>
</Grid>
</FormControl>
);
props.attributes - это массив
props.attributes = ['required','disabled']
Я хочу, чтобы атрибуты были атрибутами текстового поля, как показано ниже.
<TextField
id = {props.id}
label = {props.label}
defaultValue = {props.defaultValue || ""}
variant = "outlined"
required
disabled
/>
Я попытался сделать массив атрибутов строкой, используя
const attributes = props.attributes ? props.attributes.join(" ") : "";
а затем вставить строку в атрибуты текстового поля, подобные этому
<TextField
id = {props.id}
label = {props.label}
defaultValue = {props.defaultValue || ""}
variant = "outlined"
{...attributes}
/>
Но не помогло
attributes
должен быть объектом, поэтому, если вы конвертируете атрибуты в объект, который должен работать
проверьте ниже код:
import React from "react";
import "./style.css";
export default function App() {
const attr = { disabled: true, required: false };
return (
<div>
<h1>Hello StackBlitz!</h1>
<p>Start editing to see some magic happen :)</p>
<input type = "text" {...attr} />
</div>
);
}
рабочая рабочий пример здесь
Для этого вам нужно отправить объект реквизита, например
props = { id: 'text-id', label: 'some-label', disable: true, required: false };
и передайте это компоненту, например
<TextField
{...props}
/>
вот и все
Преобразовать массив в объект
Замените это
const attributes = props.attributes ? props.attributes.join(" ") : "";
к
const attributes = props.attributes
? props.attributes.reduce((acc, curr) => {
if (!acc[curr]) {
acc[curr] = true
}
return acc;
}, {}) : "";