- css:
- 点击:、
- 创建脚手架
- jsx中数组的遍历操作:
- 属性和状态的对比
- 数据保存在哪个组件内?
- props:
- 子传父 通过回调函数 向上传递
- ref 通信:
- 非父子通信1:
- 非父子通信2:发布订阅机制
- Context上下文环境 也是非父子通信">Context上下文环境 也是非父子通信
- React生命周期流程:
- react生命周期各个阶段
- react-router 路由">react-router 路由
- 最流行的开源React UI 组件库
- 生命周期:
- 反向代理:
- 粒子背景动效插件">粒子背景动效插件
- json-server 数据模拟 mock服务器
- axios 解决跨域
- 富文本编辑器
- Redux
- redux插件">redux插件
- react-rudux:
- 图表插件">图表插件
- 数据格式处理 Lodash 这个也是一个插件
- Mock 和联调
安装:
全局安装脚手架一次 $ cnpm install -g create-react-app
创建项目 creact-react-app-myapp
启动项目 npm start
万物皆组件:
react 最核心的思想是将页面中任何一个区域或者元素都可以看做一个组件 component
但是 注意 注意 注意 ! 组件名必须是大写, 否则报错 !!!!
jsx语法糖:
jsx 是一种语法糖, 全称 : javascrpit + xml , 只能借鉴了一些xml 语法 ,例如:
最外层必须有根节点、标签必须闭合
- jsx借鉴xml的语法而不是html的语法原因:xml要比html严谨,编译更方便
- react中jsx里的注释要写成{/ /}的方式
css:
直接是.css 文件后缀的 会引起 是全局都可以用 会冲突
不会引起样式冲突
用 .module.css 就会有作用域 不用引起全局 引入 import style from ‘xx.module.css’ 用: className={style.xxx(设置的class名)}
index.module.css文件 里面就是写样式
import style from "./index.module.css";
<div className={style.bottom}>
点击:、
第一种方法:
onClick = {this.handleClick}
handleClick = () => {
}
第二种方式:
onClick = {this.handleClick.bind(this)}
handleClick() {
}
diff 算法
就是为了减少Dom操作 提高性能
项目:
cnpm中国的 比较快 npm国外 比较慢 就要切换到淘宝镜像源
创建脚手架
1. 全局安装脚手架一次 npm install -g create-react-app
1.创建项目 create-react-app 项目名字
这是函数写法:
import React from 'react'
function App () {
<div>
hello
</div>
}
import React from 'react'
import ReactDOM from 'react-dom';
ReactDOM.render({
<App></App>,
document.getElementById('root')
})
// 页面渲染 : hello
这是class 写法:
class App extends React.Component{
render () {
return (
<div>
你是李四
</div>
)
}
}
import React from 'react'
import ReactDOM from 'react-dom';
ReactDOM.render({
<App></App>,
document.getElementById('root')
})
// 页面渲染: 你是李四
定义class 要写 className
绑定 ref 写法 refs.
setState() 更新状态:
// setState 如果是在异步中执行的话 里面就是同步执行的
// setState 并不保证是同步的
// batchUpdate 批处理
jsx中数组的遍历操作:
//vue的模板中遍历数组 ==> <li v-for="item in arr">{{item}}</li>
//React
//遍历数组 arr.map
//为什么加key?
//key 帮助 React 识别哪些元素改变了,比如被添加或删除。因此你应当给数组中的每一个元素赋予一个确定的标识。
var arr = ["aa","bb","cc"]
ReactDOM.render(
<div>
{
arr.map((item,index)=>{
return <p key={index}>{item}</p>
})
}
</div>,
document.querySelector("#box"))
实现对象的遍历 ===> 不会的转成会的
要加key! 为了 diff算法
map 遍历
.map(item => {
return (<></>)
})
map方法 必须有返回值 最好加个括号
for in 也可以
属性和状态的对比
相似点:都是纯js对象,都会触发render更新,都具有确定性(状态/属性相同,结果相同)
不同点:
- 属性能从父组件获取,状态不能
- 属性可以由父组件修改,状态不能
- 属性能在内部设置默认值,状态也可以
- 属性不在组件内部修改,状态要改
- 属性能设置子组件初始值,状态不可以
- 属性可以修改子组件的值,状态不可以
数据保存在哪个组件内?
应该给共同的父组件
子组件不能直接改变父组件的状态,状态在哪个组件,更新状态的行为就应该定义在那个组件
父组件定义函数,传递给子组件,子组件调
组件化编写功能的流程:
拆分组件 实现静态组件(只有静态界面,没有动态数据和交互) 实现动态组件 实现初始化数据动态显示 实现交互功能
props:
父 -> 子通信 就是给数据 子 直接 用this.props.传过来的参数 通过属性
用在父子通信 给子传值
import myPropTypes from "prop-types"; // 里面包含数据类型验证方法
// 属性验证 :验证每一个属性类型
// 关键字 属性验证哦
static propTypes = {
// static propTypes 是固定写法
mytext: myPropTypes.string,
isShow: myPropTypes.bool,
};
--------------------------------------------------------------
// 默认属性 :不传属性时候的默认值。
// 这里是设置默认属性的哦
static defaultProps = {
isShow: true
}