React
-
初始化命令
- cnpm i -g create-react-app 全局安装,无需配置快速构建react开发环境,基于Webpack+ES6
- create-react-app my-app 生成对应文件名的文件
- cd my-app/ 进入生成的文件
- npm start 执行启动命令
- 文件结构
- mainfest.json
- 指定开始页面index.html
- src/App.js--文件内容
- mainfest.json
- 生命周期
- componentWillMount
- 组件初始化时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state。
- componentDidMount
- 组件渲染之后调用,只调用一次。
- componentWillReceiveProps
- 组件初始化时不调用,组件接受新的props时调用
- shouldComponentUpdate
- react性能优化非常重要的一环。组件接受新的state或者props时调用,我们可以设置在此对比前后两个props和state是否相同,如果相同则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能,尤其是在dom结构复杂的时候
- componentWillUpdate
- 组件初始化时不调用,只有在组件将要更新时才调用,此时可以修改state
- componentDidUpdate
- 组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点
- componentWillUnmount
- 组件将要卸载时调用,一些事件监听和定时器需要在此时清除
- componentWillMount
- State与Props区别
- props是组建对外的接口,state是组件对内的接口
- props
- 属性值来源于父级元素,属性在React中是单向流动的:从父级到子元素
- props(属性)默认为true
- 如果没有给prop(属性)传值,默认为true
- 通常情况下,我们不建议使用这种类型,因为这会与ES6中的对象shorthand混淆 。ES6 shorthand 中 {foo} 指的是 {foo: foo} 的简写,而不是 {foo: true} 。这种行为只是为了与 HTML 的行为相匹配。
(举个例子,在 HTML 中,< input type=”radio” value=”1” disabled /> 与 < input type=”radio” value=”1” disabled=”true” />
是等价的。JSX 中的这种行为就是为了匹配 HTML 的行为。) - props扩展
- 使用扩展操作符 … 传入整个 props 对象
- 将数据进行了包装,而且还简化了赋值的书写
- State(状态)
- React的核心思想是组件化,而组件中最重要的概念是State(状态),状态(State)与属性(props)类似,都是一个组件所需要一些数据集合,但是state是私有的,可以认为state是组件的'私有属性(或则局部属性)'
- 判断是否为State
- 变量是否通过Props从父组件中获取?如果是,不是状态State
- 变量是否在组件的整个生命周期中都保持不变?
- 变量是否可以通过其它状态(State)或者属性(props)计算得到?
- 变量是否在组件的render方法中使用?如果不是,那么它不是一个状态
- 并不是组件中用到的所有变量都是组件的状态!当存在多个组件共同依赖一个状态时,一般的做法是状态上移,将这个状态放到这几个组件的公共父组件中
- 如何正确使用State
- 用setState修改State
- 直接修改state,组件并不会重新触发render()
- State的更新是异步的
- 调用setState后,setState会把要修改的状态放入一个队列中(因而 组件的state并不会立即改变)
- 之后React会优化真正的执行时机,来优化性能,所以优化过程中有可能会将多个setState的状态修改合并为一次状态修改,因而更新可能是异步的
- 所以不要依赖当前的State,计算下个State。当真正执行状态修改时,以来的this.state并不能保证是最新的State,因为React会把多次State的修改合并成一次,这时,this.state将还是这几次State修改前的State
- 另外需要注意的事,同样不能依赖当前的Props计算下个状态,因为Porps一般也是从父组件的State中获取,依然无法确定在组件状态更新时的值
- React.Fragment--render(){return(<Fragment><div></div><div></div><Fragment>)}
- React.Fragment标签可以用render函数return的jsx中
-
SyntheticEvent,event
- 事件
- 基本结构
-
import React,{ Component } from 'react'
--引入react Component import ReactDOM from 'react-dom'
import './index.css'
class Header extends Component { constructor(props){ super(props) this.state={ //状态 } } onClick(){ //函数 } render () { return ( //返回jsx结构 ) } }
-
- 重点-注意
- React只会更新必要的部分
- React Dom首先会比较元素内容先后的不同,而在渲染过程中只会更新改变了的部分
- React渲染ReactDom.render(dom)
- 插值
{js执行环境}
- jsx不能使用
if else
语句,但可以使用conditional(三元运算)表达式来代替 - React推荐使用内联样式
- 注释
{/*注释*/}
- jsx允许在模板中插入数组,数组会自动展开所有成员
- 由于jsx就是javascript,一些标识符像class和for不建议作为xml属性名-- React Dom使用className和htmlFor来做对应的属性
- React Dom首先会比较元素内容先后的不同,而在渲染过程中只会更新改变了的部分
- React只会更新必要的部分
ReactRouter
- router
- route
- component
- link
React 全家桶
- React.js
- Babel--编译
- Redux--状态管理
- React-router 路由
react-antd
- DatePicker-日期选择框
- 共同参数
- allowClear
- 是否显示清除按钮
- autoFocus
- 自动获取焦点
- className
- 选择器className
- dateRender
- 自定义日期单元格的内容
- disabled
- 禁用
- disabledDate
- 不可选择的日期
- dropdownClassName
- 额外的弹出日历className
- getCalendarContainer
- 定义浮层的容器,默认为body上新建div
- locale
- 国际化配置
- open
- 控制弹层是否展开
- placeholder
- 输入框提示文字
- popupStyle
- 额外的弹出日历央视
- size
- 输入框大小,large高度为40px,small为24px,默认为32px
- suffixIcon
- 自定义的选择框后缀图标
- style
- 自定义输入框样式
- onOpenChange
- 弹出日历和关闭日历的回调
- allowClear
- 共同的方法
- blur()
- 移除焦点
- focus()
- 获取焦点
- blur()
- 参数
- dafaultValue
- 默认日期
- disabledTime
- 不可选择的时间
- format
- 展示的日期格式
- mode
- 日期面板的状态
- renderExtraFooter
- 在面板中添加额外的页脚
- showTime
- 增加时间选择功能
- showTime.defaultValue
- 设置用户选择日期时默认的时分秒
- showToday
- 是否展示‘今天’按钮
- value
- 日期
- onChange
- 时间发生变化的回调
- onOk
- 点击确定按钮的回调
- onPanelChange
- 日期面板变化时的回调
- dafaultValue
- 共同参数
- Table
- API
- bordered
- 是否展示外边框和列边框
- childrenColumnName
- 指定树形结构的列名
- columns
- 表格列的配置描述
- components
- 覆盖默认的table元素
- dataSource
- 数据数组
- defaultExpandAllRows
- 初始化时,是否展开所有行
- defaultExpandedRowKeys
- 默认展开的行
- expandedRowKeys
- 展开的行,控制属性
- expandedRowRender
- 额外展开行
- expandRowByClick
- 通过点击来展开子行
- footer
- 表格尾部
- indentSize
- 展开树形数据时,每层缩进的宽度,以px为单位
- loading
- 页面是否加载中
- locale
- 默认文案设置,目前包括排序
- bordered
- API
echarts
- 初始化
- echarts.init(document.getElementById('main'));--基于准备好的dom,初始化echarts实例
- echarts.init(document.getElementById('main','light'))--light/dark--主题样式
- myChart.setOption(option);--使用刚指定的配置项和数据显示图表
- echarts.init(document.getElementById('main'));--基于准备好的dom,初始化echarts实例
- 配置项
- option={}配置
- title:{}-标题-左上
- legend:{}-图例-顶部
- xAxis:{}-横轴
- yAxis:{}-纵轴
- series:[]-数据
- type:
- 'pie'-饼图
- 'line'-折线图
- 'bar'-柱状图
- 'sunburst'-旭日图
- roseType:'angle'-南丁格尔
- label:{}-标签
- normal:{}
- textStyle:{}
- color:'red'
- textStyle:{}
- normal:{}
- labelLine:{}-标签线
- data:[]-数据
- radius:'55%'-图形所占大小
- itemStyle-区域样式-扇形-饼图
- itemStyle: {
- // 阴影的大小
- shadowBlur: 200,
- // 阴影水平方向上的偏移
- shadowOffsetX: 0,
- // 阴影垂直方向上的偏移
- shadowOffsetY: 0,
- // 阴影颜色
- shadowColor: 'rgba(0, 0, 0, 0.5)'
- }
- type:
- backgroundColor-背景颜色-全局
- textStyle:{}-文本样式-全局
- option={}配置
事件和行为
myChart.on('click', function (params) {
// 控制台打印数据的名称
console.log(params.name);
});
//'click'、'dblclick'、'mousedown'、'mousemove'、'mouseup'、'mouseover'、'mouseout' 支持的常规的鼠标事件类型
//所有的鼠标事件包含参数 params,这是一个包含点击图形的数据信息的对象,如下格式:
{
// 当前点击的图形元素所属的组件名称,
// 其值如 'series'、'markLine'、'markPoint'、'timeLine' 等。
componentType: string,
// 系列类型。值可能为:'line'、'bar'、'pie' 等。当 componentType 为 'series' 时有意义。
seriesType: string,
// 系列在传入的 option.series 中的 index。当 componentType 为 'series' 时有意义。
seriesIndex: number,
// 系列名称。当 componentType 为 'series' 时有意义。
seriesName: string,
// 数据名,类目名
name: string,
// 数据在传入的 data 数组中的 index
dataIndex: number,
// 传入的原始数据项
data: Object,
// sankey、graph 等图表同时含有 nodeData 和 edgeData 两种 data,
// dataType 的值会是 'node' 或者 'edge',表示当前点击在 node 还是 edge 上。
// 其他大部分图表中只有一种 data,dataType 无意义。
dataType: string,
// 传入的数据值
value: number|Array
// 数据图形的颜色。当 componentType 为 'series' 时有意义。
color: string
}
//如何区分鼠标点击到了哪里:
myChart.on('click', function (params) {
if (params.componentType === 'markPoint') {
// 点击到了 markPoint 上
if (params.seriesIndex === 5) {
// 点击到了 index 为 5 的 series 的 markPoint 上。
}
}
else if (params.componentType === 'series') {
if (params.seriesType === 'graph') {
if (params.dataType === 'edge') {
// 点击到了 graph 的 edge(边)上。
}
else {
// 点击到了 graph 的 node(节点)上。
}
}
}
});
重点-注意事项
- ECharts 中在更新数据的时候需要通过name属性对应到相应的系列,上面示例中如果name不存在也可以根据系列的顺序正常更新,但是更多时候推荐更新数据的时候加上系列的name数据。
- loading动画
myChart.showLoading();
$.get('data.json').done(function (data) {
myChart.hideLoading();
myChart.setOption(...);
});
数据的动态更新
-
ECharts 由数据驱动,数据的改变驱动图表展现的改变,因此动态数据的实现也变得异常简单。
-
所有数据的更新都通过 setOption实现,你只需要定时获取数据,setOption 填入数据,而不用考虑数据到底产生了那些变化,ECharts 会找到两组数据之间的差异然后通过合适的动画去表现数据的变化。
-
ECharts 3 中移除了 ECharts 2 中的 addData 方法。如果只需要加入单个数据,可以先 data.push(value) 后 setOption
网友评论