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

壹、React的JSX、组件、state与setState_day11-2

一、React入门

1、安装与创建项目

通过react脚手架创建项目并进行开发部署

  1. ①安装脚手架 [Create React App](https://react.docschina.org/docs/create-a-new-react-app.html#create-react-app)
  1. cnpm i -g create-react-app
  1. ②创建
  1. create-react-app xxxx(项目名)

2、React元素渲染

  1. let h1=<h1>helloworld</h1>

注意:jsx元素对象,或者组件对象,必须只有一个根节点(根元素)

二、React Jsx

1、优点

  1. JSX执行更快,编译炜JavaScript代码时进行优化
  2. 类型更安全,编译过程如果出错就不能编译,及时发现错误
  3. JSX编写模板更加简单快捷()

注意点:

  1. JSX必须要有根节点
  2. 正常的普通HTML元素要小写,如果是大写,默认是组件

2、JSX表达式

  1. 由HTML元素构成
  2. 中间如果需要插入变量用{}
  3. {}中间可以使用表达式
  4. {}中间表达式可以使用JSX对象
  5. 属性和html内容一样都是用{}来插入内容的
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './App.css'
  4. let time = new Date().toLocaleTimeString()
  5. let str = '当前时间是:'
  6. let element = (
  7. <div>
  8. <h1>helloworld</h1>
  9. <h2>{str+time}</h2>
  10. </div>
  11. )
  12. console.log(element)
  13. let man = '发热';
  14. let element2 = (
  15. <div>
  16. <h1>今天是否隔离</h1>
  17. <h2>{man=="发热"?<button>隔离</button>:"躺床上"}</h2>
  18. </div>
  19. )
  20. //let man = '发热';
  21. let element4 = (
  22. <div>
  23. <span>横着躺</span>
  24. <span>竖着躺</span>
  25. </div>
  26. )
  27. man = '正常'
  28. let element3 = (
  29. <div>
  30. <h1>今天是否隔离</h1>
  31. <h2>{man=="发热"?<button>隔离</button>:element4}</h2>
  32. </div>
  33. )
  34. let color = 'bgRed'
  35. let logo = 'https://www.baidu.com/img/pc_1c6e30772d5e4103103bd460913332f9.png'
  36. //HTML的样式类名要写className,因为class在js当中是关键词
  37. let element5 = (
  38. <div className={color}>
  39. <img src={logo} />
  40. 红色的背景颜色
  41. </div>
  42. )
  43. ReactDOM.render(
  44. element5,
  45. document.getElementById('root')
  46. )

3、JSX_style 样式

1. class,style中,不可以存在多个class属性

  1. <div class=’abc’ class={‘active’}> 错误的表示

2. stylez样式中,如果存在多个单词的属性组合,第二个单词开始,首字母大写,或者用引号引起来,否则会报错

  1. let exampleStyle = {
  2. background:"skyblue",
  3. borderBottom:"4px solid red",
  4. 'background-image':"url(https://www.baidu.com/img/pc_1c6e30772d5e4103103bd460913332f9.png)"
  5. }

3. 多个类共存的操作

  1. let element2 = (
  2. <div>
  3. <h1 className={"abc "+classStr}>helloworld</h1>
  4. </div>
  5. )
  6. let classStr2 = ['abc2','redBg2'].join(" ")
  7. let element3 = (
  8. <div>
  9. {/* 这里写注释 */}
  10. <h1 className={classStr2} style={exampleStyle}>helloworld</h1>
  11. </div>
  12. )

4. 注释

必须在括号的表达式内书写,否则报错:{/ 这里写注释 /}

5、遇到的问题与解决

1、为什么插值表达式中不能用for…of?

报错:必须为插值表达式

解:for不是插值表达式,是运算表达式

2、下面代码item.item打印出来发现是obj,准备转为数组,结果仍是obj

解:这里犯了一个基础的错误,array不是基础数据类型,Array也是obj类型,所以一开始其实就是数组,不用转换

3、由第一个问题引申出来的,for..of不是表达式 那么我要用怎么办?

虽然不能直接在插值表达式中使用,但是可以在外部定义函数,然后内部调用

  1. function Forof (){
  2. for( ... of ...)
  3. }
  4. {
  5. this.state.content.map((item,index)=>
  6. <div className='item fl' key={index}>
  7. <div className='item-title'>{item.title}</div>
  8. {
  9. item.item.map((item,index)=>
  10. <div className='item-value-fixed' key={index}><a>{item}</a></div>
  11. )
  12. // console.log(typeof Array.from(item.item))
  13. // console.log(typeof item.item)
  14. //问题一:为什么不能直接用forof,报错应为表达式 里面多加一个{}就可以
  15. //问题二:Array.from()转化出来类型还是obj
  16. //typeof [] //object js数据类型本身就是object
  17. }
  18. </div>)
  19. }

三、React组件

函数组件与类组件的区别和使用,函数式组件比较简单,一般用于静态没有交互时间内容的组件页面.类组件,一般又称为动态组件,那么一般会有交互或者数据修改的操作

1、函数式组件

  1. //函数式组件
  2. function Childcom(props){
  3. console.log(props)
  4. let title = <h2>我是副标题</h2>
  5. let weather = props.weather
  6. //条件判断
  7. let isGo = weather=='下雨' ?"不出门":"出门"
  8. return (
  9. <div>
  10. <h1>函数式组件helloworld</h1>
  11. {title}
  12. <div>
  13. 是否出门?
  14. <span>{isGo}</span>
  15. </div>
  16. </div>
  17. )
  18. }

2、类组件

  1. //类组件定义
  2. class HelloWorld extends React.Component{
  3. render(){
  4. console.log(this)
  5. return (
  6. <div>
  7. <h1>类组件定义HELLOWORLD</h1>
  8. <h1>hello:{this.props.name}</h1>
  9. <Childcom weather={this.props.weather} />
  10. </div>
  11. )
  12. }
  13. }

3、复合组件

组件中又有其他的组件,符合组件中既可以有类组件又可以有函数组件

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './04style.css';
  4. //函数式组件
  5. function Childcom(props){
  6. console.log(props)
  7. let title = <h2>我是副标题</h2>
  8. let weather = props.weather
  9. //条件判断
  10. let isGo = weather=='下雨' ?"不出门":"出门"
  11. return (
  12. <div>
  13. <h1>函数式组件helloworld</h1>
  14. {title}
  15. <div>
  16. 是否出门?
  17. <span>{isGo}</span>
  18. </div>
  19. </div>
  20. )
  21. }
  22. //类组件定义
  23. class HelloWorld extends React.Component{
  24. render(){
  25. console.log(this)
  26. //返回的都是JSX对象
  27. return (
  28. <div>
  29. <h1>类组件定义HELLOWORLD</h1>
  30. <h1>hello:{this.props.name}</h1>
  31. <Childcom weather={this.props.weather} />
  32. </div>
  33. )
  34. }
  35. }
  36. ReactDOM.render(
  37. <HelloWorld name="老陈" weather="下雨" />,
  38. document.querySelector('#root')
  39. )

四、React 的 state 和setState()

切勿直接修改state数据,直接state重新渲染内容,需要使用setState

通过this.setState修改玩数据后,并不会立即修改DOM里面的内容,react会在在这个函数内容所有设置状态改变后,同意对比虚拟DOM对象,然后再同意修改,提升性能

  1. this.state.time=new Date().toLocaleTimeString()//这个方法是错误的
  2. this.setState({
  3. time:new Date().toLocaleTimeString()
  4. })