React 入门第五步:组件布局小案例

开发 前端
从接触组件这个概念,到组件间的传递,我们学习了很多内容,也深刻的体会了 JSX 就是 JS 这个概念。而在组件间数据传递部分,Props 是核心关键点。

我们结合前面学习的内容,做一个界面布局的小案例,案例最终呈现的效果如下:

基本布局

CSS 样式已经提前写好了,放在根路径下,起名为 style.css,具体代码如下:

  1. html, body { height: 100%; } 
  2.  
  3. body { margin: 0; padding: 0; } 
  4.  
  5. .header, .footer { 
  6.   width: 100%; height: 80px; position: absoluteleft: 0; 
  7.   line-height: 80px; text-align: center; font-size: 18px; 
  8.   color: #fff; 
  9.  
  10. .header { background-color: skyblue; top: 0; } 
  11.  
  12. .footer { background-color: purple; bottom: 0; } 
  13.  
  14. .main { 
  15.   width: 100%; position: absolutetop: 80px; bottom: 80px; 
  16.   padding: 20px 0; text-align: center; background: khaki; 

我们创建好对应的子组件,分别为 src\Components\Header.js、src\Components\Home.js、src\Components\Footer.js。

在 \src\App.js 中引入上面的三个子组件及样式文件:

  1. import React, { Component } from 'react' 
  2.  
  3. import Header from './Components/Header' 
  4. import Home from './Components/Home' 
  5. import Footer from './Components/Footer' 
  6.  
  7. import './style.css' 
  8.  
  9. export class App extends Component { 
  10.   render() { 
  11.     return ( 
  12.       <> 
  13.         <Header></Header> 
  14.         <Home></Home> 
  15.         <Footer></Footer> 
  16.       </> 
  17.     ) 
  18.   } 
  19.  
  20. export default App 

 然后在子组件中,分别写好初始代码,因为已经有了对应的样式代码,因此在子组件中直接使用即可:

  1. // src\Components\Header.js   
  2. import React from 'react' 
  3.  
  4. function Header() { 
  5.   return ( 
  6.     <> 
  7.       <div className={'header'}> 
  8.         Header 
  9.       </div> 
  10.     </> 
  11.   ) 
  12.  
  13. export default Header 
  14.  
  15. // ================================================= 
  16. // src\Components\Home.js  
  17. import React from 'react' 
  18.  
  19. function Home() { 
  20.   return ( 
  21.     <> 
  22.       <div className={'main'}> 
  23.         Home 
  24.       </div> 
  25.     </> 
  26.   ) 
  27.  
  28. export default Home 
  29.  
  30. // ================================================= 
  31. // src\Components\Footer.js 
  32. import React from 'react' 
  33.  
  34. function Footer() { 
  35.   return ( 
  36.     <> 
  37.     <div className={'footer'}> 
  38.         Footer 
  39.       </div> 
  40.     </> 
  41.   ) 
  42.  
  43. export default Footer 

 基础代码实现之后,我们就能看到对应的效果了。但是,按照正常的编码逻辑,header 和 footer 应该属于公共部分,中间部分无论展示什么内容,头和尾都是需要展示的。

集成公共组件

我们需要将 Header 和 Footer 作为公共组件使用,需要添加一个src\Components\Layout.js 组件,Layout 组件的作用就是将 header与 footer 显示出来,同时把中间的 main 内容空出来,将来我们传入什么样的 JSX ,那么 main 里就显示什么样的 DOM。

在 Layout.js 中,引入 Header 与 Footer 组件并应用在 JSX 中,然后利用 JSX 传参,展示主体内容。前面我们已经学习过,这里使用的是函数组件,只需要在函数中使用形参获取 Props ,然后在展示主体内容的地方获取 {props.children} 就可以了:

  1. import React from 'react' 
  2. import Header from './Header' 
  3. import Footer from './Footer' 
  4.  
  5. function Layout(props) { 
  6.   return ( 
  7.     <> 
  8.       <Header /> 
  9.       <div className="main"
  10.         {props.children} 
  11.       </div> 
  12.       <Footer /> 
  13.     </> 
  14.   ) 
  15.  
  16. export default Layout 

 

 公共组件完成后,我们想展示那个主体组件的内容,就在那个组件中引入 Layout ,然后将主体内容以传递 jsx 的方式传入就可以了,最后再在 App 中,引入主体组件进行展示,具体代码如下:

  1. // Home.js  
  2. import React from 'react' 
  3. import Layout from './Layout' 
  4.  
  5. function Home() { 
  6.   return ( 
  7.     <Layout> 
  8.       <div>Home</div> 
  9.     </Layout> 
  10.   ) 
  11.  
  12. export default Home 
  13.  
  14. // ==================================== 
  15. // List.js  
  16. import React from 'react' 
  17. import Layout from './Layout' 
  18.  
  19. function List() { 
  20.   return ( 
  21.     <Layout> 
  22.       <div className="main"
  23.         list 
  24.       </div> 
  25.     </Layout> 
  26.   ) 
  27.  
  28. export default List 
  29.  
  30. // ==================================== 
  31. // App.js  
  32. import React, { Component } from 'react' 
  33. import Home from './Components/Home' 
  34. import List from './Components/List' 
  35.  
  36. import './style.css' 
  37.  
  38. export class App extends Component { 
  39.   render() { 
  40.     return ( 
  41.       <> 
  42.         <Home /> 
  43.         <List /> 
  44.       </> 
  45.     ) 
  46.   } 
  47.  
  48. export default App 

总的来说,就是利用了向组件传递 JSX 的特性实现的。

最后,做个小总结,从接触组件这个概念,到组件间的传递,我们学习了很多内容,也深刻的体会了 JSX 就是 JS 这个概念。

而在组件间数据传递部分,Props 是核心关键点。

但是,你可能还不知道,Props 有一个非常重要的特性:只读,意思就是我们在组件中获取到的 Props 数据,你只能用,而不能改。

官方手册的原话是:

  • 组件无论是使用函数声明还是通过class 声明,都绝不能修改自身的 Props……
  • React 非常灵活,但它也有一个严格的规则:所有 React 组件都必须像纯函数一样保护它们的 props 不被更改。

这里提到了一个 函数式编程 中的 纯函数 概念,我简单解释一下什么是纯函数:“函数不会在函数体中修改入参,且在多次调用下,相同的入参始终返回相同的结果。”

其实,从这里可以看出,React 团队希望组件本身是具有纯函数特性的,因此,Props 就需要设置为只读的,不能在组件中被修改。

但是问题是,我们界面展示的内容是需要根据数据改变而改变的,而 React 设计的核心理念中有非常重要的一点就是 数据驱动 UI。

看到这里,你一定会觉得 React 在自相矛盾,一边传入的 Props 数据是只读不可改变的,一边又依靠数据的改变而驱动 DOM 的改变。

真的是这样吗?

当然不是,数据驱动 UI 中的数据另有其人,它称之为 “state”,也叫状态,作用就是在不违反上述规则的情况下,state 允许 React 组件随用户操作、网络响应或者其他变化而动态更改输出的内容。

 

责任编辑:姜华 来源: 勾勾的前端世界
相关推荐

2012-09-21 15:18:38

Java项目Java开发

2021-09-01 18:42:57

React Props组件

2021-08-24 05:07:25

React

2021-08-26 18:46:55

React组件前端

2011-12-22 10:18:43

美信云网管

2021-08-26 00:33:29

React JSX语法

2024-01-09 09:06:13

2009-08-04 16:09:38

ASP.NET入门

2009-07-24 14:15:51

数据访问层

2020-08-26 07:48:41

React Spect组件库开发

2010-09-13 16:13:47

DIV CSS表单

2010-09-02 14:44:41

DIV CSS表单

2019-07-22 10:42:11

React组件前端

2011-04-01 10:11:25

OSPF路由器

2018-04-04 15:52:54

锐捷

2024-09-12 14:51:27

2010-08-24 10:53:52

云计算基础设施

2023-08-01 19:16:01

Spring编程浏览器

2021-03-18 08:00:55

组件Hooks React

2020-09-10 09:12:41

太空领域网络安全网络威胁
点赞
收藏

51CTO技术栈公众号