그래서 Udemy를 통해 반응을 배우고 있으며 강사는 상태를 사용하여 햄버거 재료의 내용을 동적으로 렌더링하기 위해이 코드를 작성했습니다. 기본적으로 그는 상태 객체를 배열로 변환하고이를 사용하여 물건을 렌더링합니다.
import React from "react";
import classes from "./Burger.css";
import BurgerIngredient from "./BurgerIngredients/BurgerIngr";
const burger = (props) => {
const transformedIngr = Object.keys(props.ingredients).map((igKey) => {
return [...Array(props.ingredients[igKey])].map((_, i) => {
return <BurgerIngredient key={igKey + i} type={igKey} />;
});
});
return (
<div className={classes.Burger}>
<BurgerIngredient type="bread-top" />
{transformedIngr}
<BurgerIngredient type="bread-bottom" />
</div>
);
};
export default burger;
//Object.entries(props.ingredients).map((indexOne, indexTwo)
코드가 매우 복잡해 보이며 동일한 비디오를 여러 번 보아도 이해할 수 없습니다. 내 말은, 온라인에서 조사한 결과 다음을 사용하여 객체를 배열로 변환하는 더 좋은 방법이 있음을 알았습니다.
Object.entries(props.ingredients)
누구든지 기존 코드를 설명 할 수 있습니까 ? Object.entries 를 사용하여 더 쉽게 만들 수 있습니까? 또는 동일한 작업을 수행하는 다른 대체 방법이 있습니까?
BurgerBuilder.js
import React, { Component } from "react";
import Aux from "../../hoc/aux";
import Burger from "../../components/Burger/Burger";
class BurgerBuilder extends Component {
state = {
ingredients: {
meat: 1,
salad: 2,
cheese: 1,
bacon: 1,
},
};
render() {
return (
<Aux>
<Burger ingredients={this.state.ingredients} />
<div>Controls</div>
</Aux>
);
}
}
기본 BurgerBuilder 내보내기;
BurgerIngriedent.js
import React, { Component } from "react";
import Classes from "./original.css";
import PropTypes from "prop-types";
class BurgerIngredients extends Component {
render() {
let ingredient = null;
switch (this.props.type) {
case "bread-bottom":
ingredient = <div className={Classes.BreadBottom}></div>;
break;
case "bread-top":
ingredient = (
<div className={Classes.BreadTop}>
<div className={Classes.Seeds1}></div>;
<div className={Classes.Seeds2}></div>;
</div>
);
break;
case "meat":
ingredient = <div className={Classes.Meat}></div>;
break;
case "salad":
ingredient = <div className={Classes.Salad}></div>;
break;
case "cheese":
ingredient = <div className={Classes.Cheese}></div>;
break;
case "bacon":
ingredient = <div className={Classes.Bacon}></div>;
break;
default:
ingredient = null;
break;
}
return ingredient;
}
}
BurgerIngredients.propTypes = {
type: PropTypes.string.isRequired,
};
export default BurgerIngredients;
감사합니다.
누구든지 기존 코드를 설명 할 수 있습니까?
이 부분부터 시작하겠습니다.
Object.keys(props.ingredients)
이것은 객체를 키 배열로 바꾸는 데 사용됩니다. 그래서 그것은 ['meat', 'salad', 'cheese', 'bread']
.
다음으로 문자열 배열을 매핑하여 다른 배열로 변환합니다. 새로운 배열에 무엇이 있을지 결정하는 함수는 다음과 같습니다.
(igKey) => {
return [...Array(props.ingredients[igKey])].map((_, i) => {
return <BurgerIngredient key={igKey + i} type={igKey} />;
});
}
압축을 풀기위한 첫 번째 부분은 이것이 목적이며 올바른 길이의 배열을 만드는 것입니다.
[...Array(props.ingredients[igKey])]
props.ingredients[igKey]
주어진 키와 관련된 값을 얻을 것입니다. 키가 그래서 만약 'meat'
, 다음 props.ingredients[igKey]
입니다 1
. 또는 키가 'salad'
이면 값은 2
입니다.
그 번호를 손에 들고 그들은 다음 전화를 겁니다 Array(1)
(예 :). 이것은 올바른 길이의 배열을 만듭니다. 그러나 문제가 있습니다. 배열 생성자가 작동하는 방식의 이상으로 인해이 배열을 호출하려고하면 .map
제대로 작동하지 않습니다 (값을 변경할 수 없음). 따라서이 문제를 해결하기 위해 다음 작업은 배열의 복사본을 만드는 것입니다. 그 [... ]
부분이하는 일입니다.
이제 길이가 객체의 값과 같은 배열이 있습니다. 마지막으로 할 일은 그것에 대한 호출 맵과 일부 구성 요소를 만드는 것입니다. 이것이이 코드가하는 일입니다.
.map((_, i) => {
return <BurgerIngredient key={igKey + i} type={igKey} />;
});
이 모든 작업이 완료되면 2 차원 배열이 생성됩니다. 외부 배열에는 각 성분에 대해 하나의 항목이 있고 내부 배열에는 성분 번호와 동일한 성분이 있습니다.
Object.entries를 사용하여 더 쉽게 만들 수 있습니까?
나는 그것이 어떤 중대한 변화를 가져올 것이라고 보지 않는다. 원하는 경우 Object.keys(
with를 사용할 수 Object.entries(
있지만 그 외에는 많이 변경되지 않습니다.
또는 동일한 작업을 수행하는 다른 대체 방법이 있습니까?
이 코드를 작성하는 방법에는 여러 가지가 있습니다. 일부는 제공된 예제보다 더 읽기 쉽지만 거의 모두 수행하려는 기본 작업이 동일합니다. 객체를 배열로 변환 한 다음 배열의 각 요소에 대해 올바른 배열을 만듭니다. 각 내부 배열에 대해 구성 요소를 만듭니다.
다음은 더 읽기 쉬운 명시 적 for 루프의 예입니다.
const transformedIngr = [];
for (let igKey in props.ingredients) {
const components = [];
for (let i = 0; i < props.ingredients[igKey]; i++) {
components.push(<BurgerIngredient key={igKey + i} type={igKey} />);
}
transformedIngr.push(components);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다