本人的React学习笔记分类(也是对应本人技术成长过程):[想快速入门看这部分]、[想对React系统全面进行学习的同学看这里]、[对基础学习完成且有了一定开发经验,想尝试解析源码的看这里]

一、Props

父传递给子组件数据,单向流动,不能子传递给父亲

props的传值,可以是任意的类型

props 可以设置默认值

  1. static defaultProps={name:”红吉林”,msg:“helloworld }

注意:props可以传递函数,props可以传递父元素的函数,就可以去修改父元素的state,从而达到传递数据给父元素。

1、父传子数据传递案例

  1. //在父元素中使用state去控制子元素props的从而达到父元素数据传递给子元素
  2. class ParentCom extends React.Component{
  3. constructor(props){
  4. super(props)
  5. this.state = {
  6. isActive:true
  7. }
  8. this.changeShow = this.changeShow.bind(this)
  9. }
  10. render(){
  11. return (
  12. <div>
  13. <button onClick={this.changeShow}>控制子元素显示</button>
  14. <ChildCom isActive={this.state.isActive} />
  15. </div>
  16. )
  17. }
  18. changeShow(){
  19. this.setState({
  20. isActive:!this.state.isActive
  21. })
  22. }
  23. }
  24. //孩子类
  25. class ChildCom extends React.Component{
  26. constructor(props){
  27. super(props)
  28. }
  29. render(){
  30. let strClass = null;
  31. // if(this.props.isActive){
  32. // strClass = ' active'
  33. // }else{
  34. // strClass = ""
  35. // }
  36. strClass = this.props.isActive?" active":"";
  37. return (
  38. <div className={"content"+strClass}>
  39. <h1>我是子元素</h1>
  40. </div>
  41. )
  42. }
  43. }
  44. ReactDOM.render(
  45. <ParentCom />,
  46. document.querySelector("#root")
  47. )

2、React数据传递:子传父

调用父类的函数从而操作父元素的数据,从而实现数据从子元素传递至父元素

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. //子传父
  4. /********* 父类 ********************/
  5. class ParentCom extends React.Component{
  6. constructor(props){
  7. super(props)
  8. this.state = {
  9. childData:null
  10. }
  11. }
  12. render(){
  13. return (
  14. <div>
  15. <h1>子元素传递给父元素的数据:{this.state.childData}</h1>
  16. <ChildCom setChildData={this.setChildData} />
  17. </div>
  18. )
  19. }
  20. setChildData=(data)=>{
  21. this.setState({
  22. childData:data
  23. })
  24. }
  25. }
  26. /*** 子类 **/
  27. class ChildCom extends React.Component{
  28. constructor(props){
  29. super(props)
  30. this.state = {
  31. msg:"helloworld"
  32. }
  33. }
  34. render(){
  35. return (
  36. <div>
  37. <button onClick={this.sendData}>传递helloworld给父元素</button>
  38. <button onClick={()=>{this.props.setChildData('直接调用props的函数')}}>传递helloworld给父元素</button>
  39. </div>
  40. )
  41. }
  42. sendData=()=>{
  43. //console.log(this.state.msg)
  44. //将子元素传递给到父元素,实际就是调用父元素传递进来的父元素函数
  45. this.props.setChildData(this.state.msg)
  46. }
  47. }
  48. ReactDOM.render(
  49. <ParentCom />,
  50. document.querySelector('#root')
  51. )

二、React事件

1、事件特点:

特点: 1. react事件,绑定事件的命名,驼峰命名法

  1. 2. {}传入一个函数,而不是一个字符串
  1. <button onClick={this.sendData}>传递helloworld给父元素</button>

2、React 合成事件和原生 DOM 事件的主要区别:

(1)React 组件上声明的事件没有绑定在 React 组件对应的原生 DOM 节点上。

(2)React 利用事件委托机制,将几乎所有事件的触发代理(delegate)在 document 节点上,事件对象(event)是合成对象(SyntheticEvent),不是原生事件对象,但通过 nativeEvent 属性访问原生事件对象。

(3)由于 React 的事件委托机制,React 组件对应的原生 DOM 节点上的事件触发时机总是在 React 组件上的事件之前。

(4) React返回的事件对象是代理的原生事件对象,直接查看其实都是null 如果想要查看事件的具体值,必须直接输出事件的属性

3、阻止默认事件行为:e.preventDefault()

原生,阻止默认行为时,可以直接返回return false;(比如from表单默认提交跳转页面 但我只要里面的按钮事件,而不触发外部from表单提交事件)

React中,阻止默认必须e.preventDefault();

4、事件传参

利用es6箭头函数this指向特点绑定事件指向

  1. {/* 使用ES6箭头函数传递多个参数 */}
  2. <button onClick={(e)=>{this.parentEvent1('msg:helloworld',e)}}>提交</button>
  3. {/* //不使用ES6箭头函数传递多个参数的方式 */}
  4. <button onClick={function(e){this.parentEvent1('不使用es6,msg:helloworld',e)}.bind(this)}>提交</button>

三、条件渲染

React中的条件渲染即和JavaScript中的,条件运算,如if…else…三元运算符等

  1. 直接通过条件运算返回要渲染的对象
  2. 通过条件运算得出jsx对象,在将jsx对象渲染到模板中

1、案例一

  1. mport React from 'react';
  2. import ReactDOM from 'react-dom';
  3. function UserGreet(props){
  4. return (<h1>欢迎登陆</h1>)
  5. }
  6. function UserLogin(props){
  7. return (<h1>请先登录</h1>)
  8. }
  9. class ParentCom extends React.Component{
  10. constructor(props){
  11. super(props)
  12. this.state = {
  13. isLogin:true
  14. }
  15. }
  16. render(){
  17. if(this.state.isLogin){
  18. return (<UserGreet></UserGreet>)
  19. }else{
  20. return (<UserLogin></UserLogin>)
  21. }
  22. }
  23. }
  24. ReactDOM.render(
  25. <ParentCom></ParentCom>,
  26. document.querySelector('#root')
  27. )

2、案例二

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. function UserGreet(props){
  4. return (<h1>欢迎登陆</h1>)
  5. }
  6. function UserLogin(props){
  7. return (<h1>请先登录</h1>)
  8. }
  9. class ParentCom extends React.Component{
  10. constructor(props){
  11. super(props)
  12. this.state = {
  13. isLogin:false
  14. }
  15. }
  16. render(){
  17. let element = null;
  18. if(this.state.isLogin){
  19. element = <UserGreet></UserGreet>;
  20. }else{
  21. element = (<UserLogin></UserLogin>);
  22. }
  23. return (
  24. <div>
  25. <h1>这是头部</h1>
  26. {element}
  27. <h1>这是三元运算符的操作</h1>
  28. {this.state.isLogin?<UserGreet></UserGreet>:<UserLogin></UserLogin>}
  29. <h1>这是尾部</h1>
  30. </div>
  31. )
  32. }
  33. }
  34. ReactDOM.render(
  35. <ParentCom></ParentCom>,
  36. document.querySelector('#root')
  37. )

四、列表渲染

将列表内容瓶装成数组放置到模板中,并将数据拼装成数组的jsx对象

1、简单案例一:

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. class Welcome extends React.Component{
  4. constructor(props){
  5. super(props)
  6. this.state = {
  7. list:[
  8. {
  9. title:"第一节 React事件",
  10. content:"事件内容"
  11. },
  12. {
  13. title:"第二节 React数据传递",
  14. content:"数据传递内容",
  15. },
  16. {
  17. title:"第三节 条件渲染",
  18. content:"条件渲染内容",
  19. }
  20. ]
  21. }
  22. }
  23. render(){
  24. let listArr = [];
  25. for(let i=0;i<this.state.list.length;i++){
  26. let item = (
  27. <li>
  28. <h3>{this.state.list[i].title}</h3>
  29. <p>{this.state.list[i].content}</p>
  30. </li>
  31. )
  32. listArr.push(item)
  33. }
  34. return (
  35. <div>
  36. <h1>
  37. 今天课程内容
  38. </h1>
  39. <ul>
  40. {listArr}
  41. <li>
  42. <h3>这是标题</h3>
  43. <p>内容</p>
  44. </li>
  45. </ul>
  46. </div>
  47. )
  48. }
  49. }
  50. ReactDOM.render(
  51. <Welcome></Welcome>,
  52. document.query

2、复杂案例二:

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. function ListItem(props){
  4. return (
  5. <li>
  6. <h3>{props.index+1}:listItem:{props.data.title}</h3>
  7. <p>{props.data.content}</p>
  8. </li>
  9. )
  10. }
  11. class ListItem2 extends React.Component{
  12. constructor(props){
  13. super(props)
  14. }
  15. render(){
  16. return (
  17. <li onClick={(event)=>{this.clickEvent(
  18. this.props.index,
  19. this.props.data.title,
  20. event
  21. )}}>
  22. <h3>{this.props.index+1}:listItem:{this.props.data.title}</h3>
  23. <p>{this.props.data.content}</p>
  24. </li>
  25. )
  26. }
  27. clickEvent=(index,title,event)=>{
  28. alert((index+1)+"-"+title)
  29. }
  30. }
  31. class Welcome extends React.Component{
  32. constructor(props){
  33. super(props)
  34. this.state = {
  35. list:[
  36. {
  37. title:"第一节 React事件",
  38. content:"事件内容"
  39. },
  40. {
  41. title:"第二节 React数据传递",
  42. content:"数据传递内容",
  43. },
  44. {
  45. title:"第三节 条件渲染",
  46. content:"条件渲染内容",
  47. }
  48. ]
  49. }
  50. }
  51. render(){
  52. let listArr = this.state.list.map((item,index)=>{
  53. return (
  54. <ListItem2 key={index} data={item} index={index}></ListItem2>
  55. )
  56. })
  57. return (
  58. <div>
  59. <h1>
  60. 今天课程内容
  61. </h1>
  62. <ul>
  63. //这里调用了上面的map引用组件
  64. {listArr}
  65. <li>
  66. <h3>这是标题</h3>
  67. <p>内容</p>
  68. </li>
  69. </ul>
  70. <h1>复杂没有用组件完成列表</h1>
  71. <ul>
  72. {
  73. this.state.list.map((item,index)=>{
  74. return (
  75. <li key={index} onClick={(event)=>{this.clickFn(index,item.title,event)}}>
  76. <h3>{index+1}-复杂-{item.title}</h3>
  77. <p>{item.content}</p>
  78. </li>
  79. )
  80. })
  81. }
  82. </ul>
  83. </div>
  84. )
  85. }
  86. clickFn=(index,title,event)=>{
  87. alert((index+1)+"-clickFn-"+title)
  88. }
  89. }
  90. ReactDOM.render(
  91. <Welcome></Welcome>,
  92. document.querySelector('#root')
  93. )

五、疫情数据渲染

  1. import React, {Component} from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './index.css';
  4. import './06style.css'
  5. import App from './App';
  6. import reportWebVitals from './reportWebVitals';
  7. import jsonData from './feiyan'
  8. //声明一个初始化疫情数据的对象
  9. let provincesObj = {}
  10. jsonData.data.list.forEach((item, index) => {
  11. //这里需要先初始化为0,因为后面疫情数据是要叠加的
  12. if (!provincesObj[item.province]) {
  13. provincesObj[item.province] = {
  14. confirm: 0,
  15. heal: 0,
  16. dead: 0,
  17. }
  18. }
  19. //将为空的对象属性赋值为0
  20. for (let key of Object.keys(item)) {
  21. item[key] = item[key] ? item[key] : 0
  22. }
  23. //进行同地区数据累加
  24. provincesObj[item.province] = {
  25. confirm: provincesObj[item.province].confirm + item.confirm,
  26. heal: provincesObj[item.province].heal + item.heal,
  27. dead: provincesObj[item.province].dead + item.dead
  28. }
  29. })
  30. //将其转换为数组 直接使用Array.from转换不行 因为这个对象没有length属性
  31. //这里使用for..in写法 区别于之前的for...of forin主要是遍历对象键名,of是元素值
  32. let provincesList = []
  33. for (let key in provincesObj) {
  34. provincesObj[key].province = key
  35. provincesList.push(provincesObj[key])
  36. }
  37. //进行数据大小排序
  38. let provincesListSort = provincesList.sort(
  39. (a, b) => {
  40. if (a.confirm < b.confirm) return 1
  41. else return -1
  42. }
  43. )
  44. //写一个类组件
  45. class Index extends Component {
  46. constructor() {
  47. super()
  48. }
  49. render() {
  50. return (
  51. <div>
  52. <ul>
  53. <li>
  54. <span>地区</span>
  55. <span>确诊</span>
  56. <span>死亡</span>
  57. <span>治愈</span>
  58. </li>
  59. {/*列表数据渲染*/}
  60. {
  61. this.props.list.map((item, index) => {
  62. return (
  63. <li key={index}>
  64. <span>{item.province}</span>
  65. <span>{item.confirm}</span>
  66. <span>{item.dead}</span>
  67. <span>{item.heal}</span>
  68. </li>
  69. )
  70. })
  71. }
  72. </ul>
  73. </div>
  74. )
  75. }
  76. }
  77. ReactDOM.render(
  78. <Index list={provincesListSort}/>,
  79. document.querySelector('#root')
  80. )

六、补充知识点:for循环方法

1、forEach

对数组直接进行循环,相当于直接for循环,没有返回值

2、map

map,对数组每一项进行加工,加工完成后返回一个新的数组

3、filter过滤

filter过滤,就是将想要的东西进行筛选,不要的内容去除,最终返回想要的结果

//通过返回true还是false进行选择,true就是想要,false就是去除。

4、reduce整合

reduce,是对整个数组进行整合,比如你要做一个将数组里所有的数字进行相加
将数组每一项内容整合后,返回1个内容

第一个参数是一个函数(三个内部参数前一位,当前位置,索引值),第二个参数是第一位的初始值

5、for…in和for…on

for…in…主要用于遍历对象的(遍历对象的key),不适用于遍历数组,for(key in obj),里面的每项是key
for…of…可以用来遍历数组,类数组的对象(遍历对象的value,遍历其中的key可以搭配Object.keys(obj)),字符串,set/map,generator,

  1. let arr = [1,2,3,4,5,6]
  2. //对数组直接进行循环,相当于直接for循环,没有返回值
  3. // let result = arr.forEach((item,index,arr)=>{
  4. // console.log(item)
  5. // console.log(index)
  6. // console.log(arr)
  7. // return item
  8. // })
  9. //console.log(result)
  10. let arr2 = ['香蕉',"苹果","雪梨"]
  11. //map,对数组每一项进行加工,加工完成之后返回1个新的数组
  12. // let result2 = arr2.map((item,index,arr)=>{
  13. // let str = index + item + index
  14. // return str
  15. // })
  16. // console.log(result2)
  17. let arr3 = [1,2,3,4,5,6,7,8,9];
  18. //filter过滤,就是讲想要的内容进行筛选,不要内容去除,最终返回想要的内容的数组。
  19. // let result3 = arr3.filter((item,index)=>{
  20. // if(item%2==0){
  21. // //通过返回true还是false进行选择,true就是想要,false就是去除。
  22. // return true;
  23. // }else{
  24. // return false;
  25. // }
  26. // })
  27. // console.log(result3)
  28. //reduce,是对整个数组进行整合,比如你要做一个将数组里所有的数字进行相加
  29. //将数组每一项内容整合后,返回1个内容
  30. let arr4 = [1,2,3,4,5,6,7,8,9];
  31. let result4 =arr4.reduce((pre,next,index)=>{
  32. console.log(pre);
  33. console.log(next);
  34. console.log(index)
  35. return pre+next
  36. },0)
  37. console.log(result4)
  38. //for...in...主要用于遍历对象的,不适用于遍历数组,for(key in obj),里面的每项是key
  39. //for...of...可以用来遍历数组,类数组的对象,字符串,set/map,generator,
  40. //for(item of arr),里面的是每一项
  41. let obj = {
  42. name:"老陈",
  43. type:"帅",
  44. content:"前端"
  45. }
  46. for(key in obj){
  47. console.log("key:"+key+";value:"+obj[key])
  48. }
  49. let arr5 = ["范冰冰","李晨","鹿晗"]
  50. //for of循环的是每一项
  51. for(let item of arr5){
  52. console.log(item)
  53. }