Files
2022-01-20 20:30:18 +01:00

5.6 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5a24c314108439a4d403616a 配列を props として渡す 6 301401 pass-an-array-as-props

--description--

前回のチャレンジでは、親コンポーネントから子コンポーネントに情報を props、つまりプロパティとして渡す方法を示しました。 このチャレンジでは、配列を props として渡す方法を説明します。 JSX 要素に配列を渡すには、配列を JavaScript として扱い、中括弧で囲む必要があります。

<ParentComponent>
  <ChildComponent colors={["green", "blue", "red"]} />
</ParentComponent>

これで、子コンポーネントから配列プロパティ colors にアクセスできます。 プロパティにアクセスするときは join() などの配列メソッドを使用できます: const ChildComponent = (props) => <p>{props.colors.join(', ')}</p>。これで、colors 配列のすべてのアイテムがコンマ区切りの文字列に結合され、<p>green, blue, red</p> が生成されます。あとで、React でデータの配列をレンダーする他の一般的な方法について説明します。

--instructions--

コードエディターに List コンポーネントと ToDo コンポーネントがあります。 ToDo コンポーネントから各 List をレンダーするときに、to-do タスクの配列 (たとえば ["walk dog", "workout"] など) が割り当てられた tasks プロパティを渡してください。 次に、List コンポーネントにあるこの tasks 配列にアクセスして、p 要素の中に値を表示してください。 join(", ") を使用し、props.tasks 配列をコンマ区切りリストとして p 要素に表示してください。 今日のリストには少なくとも 2 つのタスクを含め、明日のリストには少なくとも 3 つのタスクを含めてください。

--hints--

ToDo コンポーネントから単一の外側の div 要素を返します。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return mockedComponent.children().first().type() === 'div';
  })()
);

ToDo コンポーネントの 3 つ目の子要素を、List コンポーネントのインスタンスにします。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return mockedComponent.children().first().childAt(2).name() === 'List';
  })()
);

ToDo コンポーネントの 5 つ目の子要素を、List コンポーネントのインスタンスにします。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return mockedComponent.children().first().childAt(4).name() === 'List';
  })()
);

List コンポーネントの両方のインスタンスに、tasks というプロパティを持たせ、tasks を配列型にします。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return (
      Array.isArray(mockedComponent.find('List').get(0).props.tasks) &&
      Array.isArray(mockedComponent.find('List').get(1).props.tasks)
    );
  })()
);

今日のタスクを表す 1 つ目の List コンポーネントに、2 つ以上のアイテムを持たせます。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return mockedComponent.find('List').get(0).props.tasks.length >= 2;
  })()
);

明日のタスクを表す 2 つ目の List コンポーネントに、3 つ以上のアイテムを持たせます。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return mockedComponent.find('List').get(1).props.tasks.length >= 3;
  })()
);

List コンポーネントで、tasks prop からの値を p タグにレンダーします。

assert(
  (function () {
    const mockedComponent = Enzyme.mount(React.createElement(ToDo));
    return (
      mockedComponent
        .find('p')
        .get(0)
        .props.children.replace(/\s*,\s*/g, ',') ===
        mockedComponent
          .find('List')
          .get(0)
          .props.tasks.join(',')
          .replace(/\s*,\s*/g, ',') &&
      mockedComponent
        .find('p')
        .get(1)
        .props.children.replace(/\s*,\s*/g, ',') ===
        mockedComponent
          .find('List')
          .get(1)
          .props.tasks.join(',')
          .replace(/\s*,\s*/g, ',')
    );
  })()
);

--seed--

--after-user-code--

ReactDOM.render(<ToDo />, document.getElementById('root'))

--seed-contents--

const List = (props) => {
  { /* Change code below this line */ }
  return <p>{}</p>
  { /* Change code above this line */ }
};

class ToDo extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div>
        <h1>To Do Lists</h1>
        <h2>Today</h2>
        { /* Change code below this line */ }
        <List/>
        <h2>Tomorrow</h2>
        <List/>
        { /* Change code above this line */ }
      </div>
    );
  }
};

--solutions--

const List= (props) => {
  return <p>{props.tasks.join(', ')}</p>
};

class ToDo extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div>
        <h1>To Do Lists</h1>
        <h2>Today</h2>
        <List tasks={['study', 'exercise']} />
        <h2>Tomorrow</h2>
        <List tasks={['call Sam', 'grocery shopping', 'order tickets']} />
      </div>
    );
  }
};