React 进阶提升

条件渲染

  1. if条件渲染: 如果用户输入的金额>=10元, 购买成功
function BuySomething(props){
if(props.money >= 10){
return <p>恭喜, 购买成功! {props.money} >= 10</p>;
}
return <p> 购买失败,金额不足! {props.money}</p>
}
if (list.length % 2 === 0){
subTitle = <p>好记性不如烂笔头! </p>;
} else {
subTitle = <p>明日复明日, 明日何其多! </p>;
}
  1. && 连接符判断
{this.props.showTitle && (<h2>GTD 记事本</h2>)}
  1. 三目运算符判断
{/* 三目运算符/三元运算符 */}
{
list.length === 0 ?
<p>这里空空如也, 恭喜咯!</p> :
<ul>{list}</ul>
}
  1. 阻止组件渲染 (很少用到)
// 某种不希望渲染的条件发生了, 通过返回null阻止render渲染
if(true){
return null;
}
return (...);

受控组件*

在html中, input, select, textarea这些表单元素都会默认维护自己的状态,React通过受控组件将用户输入的内容保存到state中,通过渲染表单组件,控制用户输入之后发生的变化。

//1. 在构造函数初始化状态
constructor(props) {
super(props);
this.state = { money:'' };
} // 2.监听input的变化
<input type="text" value={this.state.money} onChange={this.handleChange} /> // 3.处理变化,更新state
handleChange = (e)=>{
// console.log(e.target.value);
this.setState({
money: e.target.value
})
}

状态提升*

如果有多个组件需要共享状态数据,把要MoneyInput共享的数据state={money, unit}提升到他们最近的共同父组件App中。

数据源要保证只有一个,并保持自上而下的数据流结构。

![](.\状态提升, 单位转换.png)

组件数据流

  1. 用户在MoneyInput组件中输入了数值
  2. 在input的onChange函数中,监听到了变化,把money传给父组件
  3. 父组件设置并更新到唯一的state中,状态提升完毕
  4. 因为this.setState被执行,故而render被重新触发, 根据unit,money转成不同的货币
  5. 父组件通过money={rmb}属性设置给MoneyInput组件,this.props.money

TODO-LIST

GTD软件: Getting things done

设置服务器端口

在package.json的scripts下配置

"start": "SET PORT=3456 & react-scripts start",

列表渲染

  • .map可以帮我们把数组转换成元素的数列
  • .filter 根据每个条目返回的boolean, 决定去留. true保留, false删除
  • 列表key注意:
    • key的作用时在DOM中的元素被添加或移除时, 帮助react识别是哪些元素发生了变化
    • 每个元素key需要是当前列表唯一的字符串, 一般使用id, 没有id时才使用index索引
    • key要放在列表条目的根组件 (有嵌套时)

条目PropTypes检查类型

  • 导包 import PropTypes from 'prop-types';

  • propTypes只在开发模式下进行检查,当给组件传入错误的值(或未传值),JS控制台会打印警告信息。在生产环境不会进行检查(影响页面效率)

  • 属性类型及Required检查

    /**
    * 属性类型及isRequired检查
    * order: 数字类型
    * item: 字符串类型
    */
    TodoItem.propTypes = {
    order: PropTypes.number.isRequired,
    item: PropTypes.string,
    }
  • 设置属性默认值(当父组件没有传入指定值时,使用默认值)

    /**
    * 设置属性默认值
    */
    TodoItem.defaultProps = {
    item: "默认的条目描述"
    }

export & import

Refs 和 DOM

ref用来访问DOM节点或React元素 ref是reference的缩写

  • 使用方式:

    1. 在组件得属性中添加ref={(input) => {this.inputNode = input}}
    2. 在需要用其值或引用的地方通过this.inputNode即可
  • 注意事项:
    • ref在html元素上使用, ref的引用的是DOM节点
    • ref在自定义的class组件上使用,ref的引用的是当前组件的实例
    • ref不可以在函数式声明的组件上使用, 因为其没有实例,但是可以在内部使用ref

非受控组件*

  • 如果希望表单数据由DOM处理,可以使用非受控组件方式。
  • 常见的表单受控组件及 设置/获取 值方式如下:
元素 属性值 变化回调 在回调中获取值
<input type="text" /> value="string" onChange event.target.value
<input type="checkbox" /> checked={boolean} onChange event.target.checked
<input type="radio" /> checked={boolean} onChange event.target.checked
<textarea /> value="string" onChange event.target.value
<select /> value="option value" onChange event.target.value
  • 受控组件非受控组件之间抉择:参考文档

    如果表单的UI交互非常简单:通过refs实现非受控组件即可。

    如果表单的UI交互比较复杂:官方推荐使用受控组件实现表单,把DOM节点/React元素的值或数据交给React组件处理(保存到state)。

路由

参考链接1

中文参考文档

安装:

yarn add react-router-dom

导入Module:

import { BrowserRouter as Router, Route, Link } from 'react-router-dom'

声明路由器及路由:

<Router>
<div>
<Route exact={true} path="/" render={() => (<TodoComponent showTitle={true} />)}/>
<Route path="/about" component={About}/>
</div>
</Router>

通过Link跳转

<Link to="/about">关于about</Link>
<Link to="/">主页Home</Link>
  • 通过path声明路由路径;
  • exact={true}表示严格匹配path
  • 通过component指定要渲染的组件;
  • 通过render属性配合箭头函数,可以给组件传入属性参数。
  • 通过Link的to属性指定要跳转的路径

组合

React提供了强大的组合模型,官方建议使用组合(而非继承)来复用组件代码。

包含

  • 当一些组件不能提前知道他们的全部子组件是什么, 比如Dialog,Menu, Sidebar
  • 通过组件内render声明{props.children},使用时在标签内部填入自定义的元素内容即可。
  • 通过自定义字段可以使组件拥有多个自定义元素入口。比如subTitle
  1. 声明:

    function AboutPanel(props) {
    return (
    <div className="about-panel">
    <h2 className="about-title">{props.title}</h2>
    {props.subTitle} <p>{props.desc}</p>
    {props.children}
    </div>
    );
    }
  2. 使用:

    <AboutPanel
    title="兴趣爱好"
    desc="性别男, 爱好女。最大的缺点是太实诚,总爱习惯性给公司免费加班" >
    <input type="text" ref={(input) => this.textInput = input}/>
    <button onClick={() => alert(this.textInput.value)}>点评</button>
    </AboutPanel>

特殊实例

// 这里AboutPanelSpcial 是 AboutPanel 的特殊实例
class AboutPanelSpcial extends React.Component{
render(){
return (
<AboutPanel
title="工作履历"
subTitle={<h5>人生精力丰富, 行业跨度大</h5>}
desc="走过男闯过北, 火车道上压过腿; 养过狼放过虎, 少林寺里练过武"
/>
)
}
}

三方UI设计语言

打包及发布

npm run build

运行服务器代码: build包含index.html文件的文件夹

前台运行: serve -s build

后台运行(指定端口80): nohup serve -s build -l 80 &

今天所有安装的包

  1. react-router-dom 路由

    应用场景:页面切换

    安装方式:yarn add react-router-dom

  2. serve 开启服务

    应用场景:部署打包好的应用

    安装方式:yarn global add serve

React02的更多相关文章

随机推荐

  1. ASP.NET中刷新分页

    1,第一次全部把数据加载到内存中,然后再做分页,性能差,不推荐. 2,GridView自带分页 3,AspNetPager分页控件  这个是第三分控件需要下载,很好用 4,自己写分页 前三种就不介绍如 ...

  2. C# return语句

    一.C# return语句 return语句用于终止它出现在其中的方法的执行,并将控制返回给调用方法. 语法格式如下: return ...;return语句还可以返回一个可选值.如果方法为void类 ...

  3. javascript入门笔记6-内置对象

    1.Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date() ...

  4. nvl()函数和nvl2()函数

    如果你某个字段为空,但是你想让这个字段显示0,可以使用nvl(字段名,0),当然这个0也可以换成其他东西,如:1,2,3…… 一 NVL(表达式1,表达式2) 如果表达式1为空值,NVL返回值为表达式 ...

  5. js、jquery初始化加载顺序

    // ready 这个方法只是在页面所有的DOM加载完毕后就会触发 // 方式1 $(function(){ // do something }); // 方式2 $(document).ready( ...

  6. vim 个性化设置和操作

    一.vim 设置 1. 设置行号显示 1) 临时显示 命令行模式 :set nu 2) 永久显示 # vim ~/.vimrc 插入一行代码: set number 若没有该文件,在用户主目录 (/h ...

  7. Shell脚本使用汇总整理

    Shell脚本使用汇总整理 一.Shell脚本常用的头部格式: 头部的作用就是告知linux此脚本的类型: 常用的头部格式如下:(/bin/bash,是bash的路径,如果不知道路径可以通过which ...

  8. lnamp高性能架构之apache和nginx的整合

    搭建过lamp博友和lnmp的博友们可能对这这两个单词并不陌生,对与apachen,nginx相比都源码或yum安装过,但知道apache的nginx的优点,apache处理动态页面很强,nginx处 ...

  9. 开放定址法——平方探测(Quadratic Probing)

    为了消除一次聚集,我们使用一种新的方法:平方探测法.顾名思义就是冲突函数F(i)是二次函数的探测方法.通常会选择f(i)=i2.和上次一样,把{89,18,49,58,69}插入到一个散列表中,这次用 ...

  10. POJ:2566-Bound Found(尺取变形好题)

    Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5408 Accepted: 1735 Special J ...