【React】 React的优点+实现分页组件
来源:互联网 发布:干部网络培训怎么快速 编辑:程序博客网 时间:2024/05/16 09:50
在上一篇文章中,介绍了React为什么会被创建,但是翻译完那篇文章后,并没有解答我的问题,我为什么要用React。
在学习React一个多月之后,通过学习教程和官方API,也有了一些自己的理解。
React的优点:
简单
仅仅只要表达出你的应用程序在任一个时间点应该长的样子,当底层的数据变了,React 会自动处理所有用户界面的更新。
声明式 (Declarative)
数据变化后,React 概念上与点击“刷新”按钮类似,但仅会更新变化的部分。
构建可组合的组件
React 都是关于构建可复用的组件。事实上,通过 React 你唯一要做的事情就是构建组件。得益于其良好的封装性,组件使代码复用、测试和关注分离(separation of concerns)更加简单。
虚拟DOM
React采取了一种特立独行的操作DOM的方式,它并不直接对DOM进行操作,而是引入了虚拟DOM的概念,安插在JavaScript逻辑和实际的DOM之间。这一概念提高了Web性能。在UI渲染过程中,React通过在虚拟DOM中的微操作来实对现实际DOM的局部更新。
单向数据流让事情一目了然
Flux是一个用于在JavaScript应用中创建单向数据层的架构,它随着React视图库的开发而被Facebook概念化。它只是一个概念,而非特定工具的实现。它可以被其它框架吸纳。React中的数据从父级流向子级。
使用步骤:
1、拿到一个构建页面的时候,首先要将其转化成组件树。
意思就是,你要看一下这个页面需要拆成几个组件。秉承的原则就是,一个组件完成一个功能。我的做法是将需要做的组件写出来,连同它要完成的功能都写出来
2、用React创建构建页面的静态版本
这一步会构造一些组件,这些组件重用其它组件,并且通过 props 传递数据。 props 是一种从父级向子级传递数据的方式。 state 仅用于实现交互功能,也就是说,数据随着时间变化。因为这是一个静态的应用版本,所以这里并不需要 state 。
可以从上至下或者从下至上来构建应用。也就是说,你可以从属性结构的顶部开始构建这些组件,或者从底部开始。我选择从下至上的方式,这样也可以在构建的同时写测试代码。
注:写的时候会用到构建中的css类名,这时候要注意react中是用className来加类名的
3、实现交互功能
这一步就是要弄清楚,数据是怎么传输的。props可以让数据从父级传递到子级,而有时候我们会需要数据的反向传递,即从子组件传递用户输入给父组件,这个时候就需要回调函数了。
我的项目中,所有的state都放在了父组件中,通过props向子组件中传递数据。在子组件中会有回调函数,用该函数来向父组件中传递数据。
Demo:用react实现分页组件
详情请移步github
import React from 'react';import ReactDOM from 'react-dom';//分页组件export default class extends React.Component{ constructor() { super(); this.state = { showLinkNum : 5 //每次显示的页数 } } //控制页码跳转的函数 pageIndexChange(event){ let target = event.target; let index = ""; let pageIndex = target.value; let pageInputIndex = target.value; var type = target.getAttribute("data-type"); if (type == "link") { index = event.target.innerHTML; if (!isNaN(index)) { pageIndex = index; }else if (index =="首页") { pageIndex = 1; }else if (index == "尾页") { pageIndex = this.props.pageNum; }else if (index == "»") { pageIndex = parseInt(this.props.pageIndex) + 1; }else if (index == "«") { pageIndex = parseInt(this.props.pageIndex) - 1; } this.props.pageIndexChange(pageIndex); }else if (type == "btn-go") { let goIndex = document.getElementById("index-input"); pageInputIndex = goIndex.value; this.props.pageIndexChange(pageInputIndex); }else if (type == "input") { return null; } } render(){ var arrFirst = [];//首页和前一页 var arrLast = [];//尾页和后一页 var arrLinkShow = []; //每次显示的页码 var prevDisplay = 1 == this.props.pageIndex ? 'disabled': ''; //当前页为1时,首页和前一页失效 var lastDisplay = this.props.pageNum == this.props.pageIndex ? 'disabled':'';//当前页为最后一页时,尾页和后一页失效 var startIndex = (Math.ceil(this.props.pageIndex/this.state.showLinkNum)-1) * this.state.showLinkNum + 1;//每次显示页数的开始页 var endIndex = Math.min(startIndex + this.state.showLinkNum,(this.props.pageNum+1));//每次显示页数的结束页 for ( var i = startIndex; i < endIndex; i++ ) { var currentIndexDisplay = i == this.props.pageIndex ? 'active' : ''; arrLinkShow.push( <li key = {i} className = {currentIndexDisplay}> <a href="javascript:;" data-type = "link">{i}</a> </li> ) } arrFirst.push( <li key="first" className = {prevDisplay}> <a href="javascript:;" data-type = "link" >首页</a> </li> ); arrFirst.push( <li key = "1" className = {prevDisplay}> <a href="javascript:;" aria-label="Previous" data-type = "link" id = "pre" > « </a> </li> ); arrLast.push( <li key = "last" className = {lastDisplay}> <a href="javascript:;" data-type = "link">尾页</a> </li> ); arrLast.push( <li key ={this.props.pageNum} className = {lastDisplay} > <a href="javascript:;" aria-label="Next" data-type = "link" id = "next"> » </a> </li> ) return ( <nav className="text-right" key="page"> <ul className="pagination" onClick = {this.pageIndexChange.bind(this)}> {arrFirst} {arrLinkShow} {arrLast} <li> <input type="text" data-type = "input" id="index-input" /> <a href="javascript:;" className="btn page-go" data-type = "btn-go">跳转</a> </li> </ul> </nav> ) }}
- 【React】 React的优点+实现分页组件
- React实现分页组件(简短版)
- react实现的面板组件
- React简单的分页代码实现(子组件向父组件传值)
- react实现表单组件
- React-组件渲染和更新的实现
- React:组件的生命周期
- React-组件的复合
- React的表单组件
- React-组件的复合
- React 组件的生命周期
- React组件的生命周期
- React组件的生命周期
- React组件的生命周期
- React组件的生命周期
- React:组件的生命周期
- React组件的生命周期
- React组件的生命周期
- cookie设置HttpOnly
- Mac 基础教程:如何删除右键菜单重复项目
- js调用OC代码
- 回调接口
- cocoapods 安装第三方库后报错
- 【React】 React的优点+实现分页组件
- Ajax笔记
- CSS——定位模式
- 二分匹配ZOJ3646
- default not found
- 软件嵌入式研发行业源代码安全管理方案概要
- SQL表连接查询(inner join、full join、left join、right join)
- 使用Aurora在word中插入公式
- 在eclipse下开发spark程序环境配置