#reactjs
#reactjs
Вопрос:
Я создаю клон Figma. У меня есть то, что я считаю простой проблемой. В Figma вы можете добавлять линии, изображения, прямоугольники, 20 других типов элементов дизайна.
Проблема, с которой я сталкиваюсь, заключается в том, что при нажатии на эти элементы дизайна появляется инспектор, который отличается для каждого элемента (инспектор прямоугольников отличается от инспектора изображений).
Итак, должен ли я создавать 2 0 разных компонентов для каждого элемента дизайна? Каков наилучший способ структурировать это? Спасибо!
Ответ №1:
Я думаю, что лучший способ сделать это — сделать все необходимые входные данные и кнопки в другом компоненте, поэтому вы можете импортировать их следующим образом :
import {SizeInput, ColorInput, SomthingInput} from InspectInputs;
Затем создайте объект для каждого элемента, который у вас есть, вот так :
const inspect = {
rectangle : [
<SizeInput />,
<ColorInput />,
],
image : [
<SizeInput />,
<ColorInput />,
<SomthingInput />
],
};
И, наконец, используйте их так :
const Inspector = ({type}) => (
<div>{inspect[type].map((child) => child)}</div>;
)
Пример
const inputChange = (e) => {
console.log(e.currentTarget.value);
};
const inspectArray = [
{
name: "Rectangle",
element: [
<input type="text" key="1" />,
<input type="range" key="2" />,
<input type="color" key="3" onInput={inputChange} />,
],
},
{
name: "Image",
element: [
<div key="1">
<input type="text" key="1.1" value="Some Value" />
<input type="text" key="1.2" />
</div>,
<input type="range" key="2" />,
<input type="color" key="3" onInput={inputChange} />,
],
},
];
const Inspector = ({ index }) =>
index !== null amp;amp; (
<div
style={{
width: 300,
display: "flex",
flexDirection: "column",
}}
>
<h1>{inspectArray[index].name}</h1>
{inspectArray[index].element.map((child) => child)}
</div>
);
function App() {
const [inspect, setInspect] = React.useState(null);
return (
<div>
{inspectArray.map((item, i) => (
<button key={i} onClick={() => setInspect(i)}>
{item.name}
</button>
))}
<Inspector index={inspect} />
</div>
);
}
ReactDOM.render(
<App/>,
document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>
Вы можете сделать свой элемент массива похожим на компонент и использовать onChange
или onInput
использовать для всего или сделать их отдельными, очень просто.
Комментарии:
1. О, потрясающе!! Это выглядит великолепно. Как я мог передать реквизит в
SizeInput
операционнуюColorInput
?2. используйте Context или Redux для управления реквизитами и состояниями. для чего-то большого, такого как Figma, вероятно, следует использовать библиотеку управления состоянием
3. конечно, для чего-то, что не является сложным, например, key, u может передавать каждому дочернему элементу следующим образом
<SizeInput key="1" />
4. Да, но я думаю, что я немного сбит с толку тем, как вы вообще предоставите ключ? Есть ли шанс, что вы могли бы привести пример в своем ответе?
5. @NickSmith проверьте пример.