一、开篇
大家好,本系列文章小编将和大家一起,从最基础的真实案例实践 React Hook 相关的知识,如果你已经很熟练了 React Hook 相关内容了,本系列文章你可以忽略。
本系列文章由浅入深,将从最简单的案例开始学习,本篇文章将从两个列表的数据渲染开始讲起,一个是从本地文件获取数据、另一个通过接口请求的方式获取数据。
二、案例1:生日列表加载本地数据
如下图所示,本案例从本地数据加载生日列表数据,列表数据包含了用户的头像、姓名、年龄,同时又包含了一个清除数据的按钮。
2.1、创建项目
开始之前,我们通过 create-react-app 命令创建项目 birthday-reminder,删除一些不相关的文件,保留 App.js、index.css、index.js,index.js 的文件内容修改如下:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
// src/index.js
2.2、设计本地文件数据结构
本案例的数据结构比较简单,一个数组对象,包含 id、name(姓名)、age(年龄)、image(图片地址),新建 data.js 数据文件,示例结构如下:
export default [
{
id: 1,
name: 'Bertie Yates',
age: 29,
image:
'https://res.cloudinary.com/diqqf3eq2/image/upload/v1595959131/person-2_ipcjws.jpg',
},
{
id: 2,
name: 'Hester Hogan',
age: 32,
image:
'https://res.cloudinary.com/diqqf3eq2/image/upload/v1595959131/person-3_rxtqvi.jpg',
},
//更多数据...
]
// src/data.js
2.3、新建本地样式文件
基于页面,我们新建 index.css 文件,定义基础的颜色和常用的尺寸变量等,由于代码比较简单,这里就不过多解释啦,直接贴上代码
/*
===============
Variables
===============
*/
:root {
/* dark shades of primary color*/
--clr-primary-1: hsl(162, 61%, 89%);
--clr-primary-2: hsl(162, 60%, 78%);
--clr-primary-3: hsl(162, 61%, 67%);
--clr-primary-4: hsl(162, 61%, 57%);
/* primary/main color */
--clr-primary-5: hsl(162, 73%, 46%);
/* lighter shades of primary color */
--clr-primary-6: #1aa179;
--clr-primary-7: #13795b;
--clr-primary-8: #0d503c;
--clr-primary-9: #06281e;
/* darkest grey - used for headings */
--clr-grey-1: hsl(212, 33%, 89%);
--clr-grey-2: hsl(210, 31%, 80%);
--clr-grey-3: hsl(211, 27%, 70%);
--clr-grey-4: hsl(209, 23%, 60%);
/* grey used for paragraphs */
--clr-grey-5: hsl(210, 22%, 49%);
--clr-grey-6: hsl(209, 28%, 39%);
--clr-grey-7: hsl(209, 34%, 30%);
--clr-grey-8: hsl(211, 39%, 23%);
--clr-grey-9: hsl(209, 61%, 16%);
--clr-white: #fff;
--clr-red-dark: hsl(360, 67%, 44%);
--clr-red-light: hsl(360, 71%, 66%);
--clr-green-dark: hsl(125, 67%, 44%);
--clr-green-light: hsl(125, 71%, 66%);
--clr-black: #222;
--transition: all 0.3s linear;
--spacing: 0.1rem;
--radius: 0.25rem;
--light-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
--dark-shadow: 0 5px 15px rgba(0, 0, 0, 0.4);
--max-width: 1170px;
--fixed-width: 450px;
--clr-pink: #f28ab2;
}
/*
===============
Global Styles
===============
*/
*,
::after,
::before {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background: var(--clr-pink);
color: var(--clr-grey-9);
line-height: 1.5;
font-size: 0.875rem;
}
ul {
list-style-type: none;
}
a {
text-decoration: none;
}
h1,
h2,
h3,
h4 {
letter-spacing: var(--spacing);
text-transform: cap