ReactJS - 组件集合



在现代应用程序中,开发人员会遇到很多需要以表格格式或画廊格式渲染项目列表(例如待办事项、订单、发票等)的情况。React 提供了清晰、直观且易于使用的技术来创建基于列表的用户界面。React 使用两个现有功能来实现此功能。

  • JavaScript 内置的 map 方法。
  • jsx 中的 React 表达式。

Map 方法

map 函数接受一个集合和一个映射函数。map 函数将应用于集合中的每个项目,并将结果用于生成一个新的列表。

例如,声明一个包含 5 个随机数的 JavaScript 数组,如下所示 -

let list = [10, 30, 45, 12, 24]

现在,应用一个匿名函数,该函数将其输入加倍,如下所示 -

result = list.map((input) => input * 2);

然后,生成的列表为 -

[20, 60, 90, 24, 48]

为了刷新 React 表达式,让我们创建一个新变量并为其赋值一个 React 元素。

var hello = <h1>Hello!</h1> 
var final = <div>{helloElement}</div>

现在,React 表达式 hello 将与 final 合并并生成,

<div><h1>Hello!</h1></div>

示例

让我们应用此概念来创建一个组件,以表格格式显示费用条目项目的集合。

步骤 1 - 在您喜欢的编辑器中打开我们的 expense-manager 应用程序。

src/components 文件夹中创建一个 ExpenseEntryItemList.css 文件以包含组件的样式。

src/components 文件夹中创建另一个文件 ExpenseEntryItemList.js 以创建 ExpenseEntryItemList 组件

步骤 2 - 导入 React 库和样式表。

import React from 'react'; 
import './ExpenseEntryItemList.css';

步骤 3 - 创建 ExpenseEntryItemList 类并调用构造函数。

class ExpenseEntryItemList extends React.Component {  
   constructor(props) { 
      super(props); 
   } 
}

创建 render() 函数。

render() { 
}

步骤 4 - 使用 map 方法生成 HTML 表格行的集合,每个表格行代表列表中的单个费用条目项目。

render() {
   const lists = this.props.items.map( (item) => 
      <tr key={item.id}>
         <td>{item.name}</td>
         <td>{item.amount}</td>
         <td>{new Date(item.spendDate).toDateString()}</td>
         <td>{item.category}</td>
      </tr>
   );
}

这里,key 标识每一行,并且在列表中必须是唯一的。

步骤 5 - 接下来,在 render() 方法中,创建一个 HTML 表格并在 rows 部分包含 lists 表达式。

return (
   <table>
      <thead>
         <tr>
            <th>Item</th>
            <th>Amount</th>
            <th>Date</th>
            <th>Category</th>
         </tr>
      </thead>
      <tbody>
         {lists}
      </tbody>
   </table>
);

最后,导出组件。

export default ExpenseEntryItemList;

现在,我们已经成功创建了将费用项目渲染到 HTML 表格中的组件。完整的代码如下 -

import React from 'react';
import './ExpenseEntryItemList.css'

class ExpenseEntryItemList extends React.Component {
   constructor(props) {
      super(props);
   }
   render() {
      const lists = this.props.items.map( (item) => 
         <tr key={item.id}>
            <td>{item.name}</td>
            <td>{item.amount}</td>
            <td>{new Date(item.spendDate).toDateString()}</td>
            <td>{item.category}</td>
         </tr>
      );
      return (
         <table>
            <thead>
               <tr>
                  <th>Item</th>
                  <th>Amount</th>
                  <th>Date</th>
                  <th>Category</th>
               </tr>
            </thead>
            <tbody>
               {lists}
            </tbody>
         </table>
      );
   }
}
export default ExpenseEntryItemList;

index.js

打开 index.js 并导入我们新创建的 ExpenseEntryItemList 组件。

import ExpenseEntryItemList from './components/ExpenseEntryItemList'

接下来,在 index.js 文件中声明一个列表(费用条目项目)并使用一些随机值填充它。

const items = [
   { id: 1, name: "Pizza", amount: 80, spendDate: "2020-10-10", category: "Food" },
   { id: 1, name: "Grape Juice", amount: 30, spendDate: "2020-10-12", category: "Food" },
   { id: 1, name: "Cinema", amount: 210, spendDate: "2020-10-16", category: "Entertainment" },
   { id: 1, name: "Java Programming book", amount: 242, spendDate: "2020-10-15", category: "Academic" },
   { id: 1, name: "Mango Juice", amount: 35, spendDate: "2020-10-16", category: "Food" },
   { id: 1, name: "Dress", amount: 2000, spendDate: "2020-10-25", category: "Cloth" },
   { id: 1, name: "Tour", amount: 2555, spendDate: "2020-10-29", category: "Entertainment" },
   { id: 1, name: "Meals", amount: 300, spendDate: "2020-10-30", category: "Food" },
   { id: 1, name: "Mobile", amount: 3500, spendDate: "2020-11-02", category: "Gadgets" },
   { id: 1, name: "Exam Fees", amount: 1245, spendDate: "2020-11-04", category: "Academic" }
]

通过 items 属性传递项目来使用 ExpenseEntryItemList 组件。

ReactDOM.render(
   <React.StrictMode>
      <ExpenseEntryItemList items={items} />
   </React.StrictMode>,
   document.getElementById('root')
);

index.js 的完整代码如下 -

import React from 'react';
import ReactDOM from 'react-dom';
import ExpenseEntryItemList from './components/ExpenseEntryItemList'

const items = [
   { id: 1, name: "Pizza", amount: 80, spendDate: "2020-10-10", category: "Food" },
   { id: 1, name: "Grape Juice", amount: 30, spendDate: "2020-10-12", category: "Food" },
   { id: 1, name: "Cinema", amount: 210, spendDate: "2020-10-16", category: "Entertainment" },
   { id: 1, name: "Java Programming book", amount: 242, spendDate: "2020-10-15", category: "Academic" },
   { id: 1, name: "Mango Juice", amount: 35, spendDate: "2020-10-16", category: "Food" },
   { id: 1, name: "Dress", amount: 2000, spendDate: "2020-10-25", category: "Cloth" },
   { id: 1, name: "Tour", amount: 2555, spendDate: "2020-10-29", category: "Entertainment" },
   { id: 1, name: "Meals", amount: 300, spendDate: "2020-10-30", category: "Food" },
   { id: 1, name: "Mobile", amount: 3500, spendDate: "2020-11-02", category: "Gadgets" },
   { id: 1, name: "Exam Fees", amount: 1245, spendDate: "2020-11-04", category: "Academic" }
]
ReactDOM.render(
   <React.StrictMode>
      <ExpenseEntryItem item={item} />
   </React.StrictMode>,
   document.getElementById('root')
);

ExpenseEntryItemList.css

打开 ExpenseEntryItemList.css 并为表格添加样式。

html {
  font-family: sans-serif;
}
table {
   border-collapse: collapse;
   border: 2px solid rgb(200,200,200);
   letter-spacing: 1px;
   font-size: 0.8rem;
}
td, th {
   border: 1px solid rgb(190,190,190);
   padding: 10px 20px;
}
th {
   background-color: rgb(235,235,235);
}
td, th {
   text-align: left;
}
tr:nth-child(even) td {
   background-color: rgb(250,250,250);
}
tr:nth-child(odd) td {
   background-color: rgb(245,245,245);
}
caption {
   padding: 10px;
}

使用 npm 命令启动应用程序。

npm start

输出

最后,打开浏览器并在地址栏中输入 https://127.0.0.1:3000 并按回车键。

项目 金额 日期 类别
披萨 80 2020年10月10日星期六 食物
葡萄汁 30 2020年10月12日星期一 食物
电影 210 2020年10月16日星期五 娱乐
Java 编程书籍 242 2020年10月15日星期四 学术
芒果汁 35 2020年10月16日星期五 食物
连衣裙 2000 2020年10月25日星期日 布料
旅游 2555 2020年10月29日星期四 娱乐
餐食 300 2020年10月30日星期五 食物
手机 3500 2020年11月2日星期一 小工具
考试费用 1245 2020年11月4日星期三 学术
广告