React 入门:实战案例 TodoList 组件列表动态初始化


本文实现 TodoList 组件列表动态初始化。

目标实现效果

在这里插入图片描述

实现思路

通过父子组件之间通信,使用 props 从父组件把数据传递到子组件中。

实现步骤

第一步:App 组件定义 TodoList 动态数据列表

在 App 组件中通过 state 定义 TodoList 数据列表,代码片段如下:

// src/App.js

state = {
  todoList: [
    { id: 1, name: "参加晨会", done: true },
    { id: 2, name: "A功能开发", done: true },
    { id: 3, name: "B功能开发", done: false },
  ],
};

第二步:App 组件通过 props 传递数据到子组件 List

通过 propsstate 中的 TodoList 数据传递到 List 组件中,代码片段如下:

// src/App.js

<List todoList={todoList} />

第三步:List 组件接收 props 传入数据,并传入子组件 Item

在 List 组件中接收通过 props 传递进来的数据,并渲染到到组件中,代码片段如下:

// src/components/List/index.jsx

// 修改 List 组件的 render() 函数如下
render() {
  // 从 props 读取 TodoList
  const { todoList } = this.props;
  return (
    <ul className="todo-main">
      {/* 遍历渲染 Item 组件,同时将 TodoList 的数据传入 */}
      {todoList.map((todo) => {
        return <Item key={todo.id} {...todo} />;
      })}
    </ul>
  );
}

代码技巧<Item key={todo.id} {...todo} /> 这个代码中使用了 js 的展开运算符 ... 可以高效灵活的将一个对象展开为组件的 props 属性。

第四步:Item 组件接收 props 数据

在 Item 组件中接收通过 props 传递进来的数据,并渲染到到组件中,代码片段如下:

// src/components/Item/index.jsx

// 修改 Item 组件的 render() 函数如下
render() {
  // 从 props 读取 TodoList 的数据
  const { name, done } = this.props;
  return (
    <li>
      <label className="container">
        <input type="checkbox" defaultChecked={done} />
        <span>{name}</span>
      </label>
      <button className="btn btn-danger btn-sm" style={{ display: "none" }}>
        删除
      </button>
    </li>
  );
}

注意<input type="checkbox" defaultChecked={done} /> 中初始渲染 TodoList 记录的初始状态,要使用 defaultChecked,而不能使用 checked,如果使用了 checked 则会导致界面上的 checkbox 点击时不能切换选中/取消的状态了。

至此,完成了 TodoList 列表的数据动态化。

完整代码

App 组件完整代码

// file: src/App.js

import React, { Component } from "react";
import Header from "./components/Header";
import List from "./components/List";
import Footer from "./components/Footer";
import "./App.css";

export default class App extends Component {
  // 初始化状态
  state = {
    todoList: [
      { id: 1, name: "参加晨会", done: true },
      { id: 2, name: "A功能开发", done: true },
      { id: 3, name: "B功能开发", done: false },
    ],
  };

  render() {
    const { todoList } = this.state;
    return (
      <div className="todo-container">
        <div className="todo-wrap">
          <Header />
          <List todoList={todoList} />
          <Footer />
        </div>
      </div>
    );
  }
}

List 组件完整代码

// file: src/components/List/index.jsx

import React, { Component } from "react";
import Item from "../Item";
import "./index.css";

export default class List extends Component {
  render() {
    // 从 props 读取 TodoList
    const { todoList } = this.props;
    return (
      <ul className="todo-main">
        {/* 遍历渲染 Item 组件,同时将 TodoList 的数据传入 */}
        {todoList.map((todo) => {
          return <Item key={todo.id} {...todo} />;
        })}
      </ul>
    );
  }
}

Item 组件完整代码

// file: src/components/Item/index.jsx

import React, { Component } from "react";
import "./index.css";

export default class Item extends Component {
  render() {
    const { name, done } = this.props;
    return (
      <li>
        <label className="container">
          <input type="checkbox" defaultChecked={done} />
          <span>{name}</span>
        </label>
        <button className="btn btn-danger btn-sm" style={{ display: "none" }}>
          删除
        </button>
      </li>
    );
  }
}

至此完成 TodoList 组件列表动态初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西涯三锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值