React是一个用于构建用户界面的javaScript库,起源于facebook的内部项目,后续在13年开源了出来
特点
你只需要描述UI看起来是什么样式,就跟写HTML一样,React负责渲染UI
组件时React最重要的内容,组件表示页面中的部分内容
使用React可以开发Web应用,使用React可以开发移动端,可以开发VR应用
npm i react react-dom
// 创建元素节点
// 1. 参数一:元素名称
// 2. 参数二:元素属性 传递的是个对象
// 3. 参数三及以后:元素内容
let title = React.createElement('li', null, 'hellow react',React.createElement('span',null,'这是span');
// 渲染到页面
ReactDOM.render(title,document.getElementById('root'))
npx create-react-app my-pro
npm start
import React from 'react'
import ReactDOM from 'react-dom'
let h1 = React.createElement('h1',null,'我是标题')
ReactDOM.render(h1,document.getElementById('root'))
由于通过createElement()方法创建的React元素有一些问题,代码比较繁琐,结构不直观,无法一眼看出描述的结构,不优雅,用户体验不爽
JSX是JavaScript XML 的简写,表示在JavaScript代码中写HTML格式的代码
优势:声明式语法更加直观,与HTML结构相同,降低了学习成本,提升开发效率
let h1 = 我是通过JSX创建的元素
ReactDOM.render(h1,document.getElementById('root'))
注意点
/>
来结束JSX是来描述页面的结构,我们一般在编写业务逻辑渲染页面的时候,需要涉及到传递值,调用函数,判断条件,循环等,这一些在JSX中都能得到支持
语法:{JavaScritp表达式}
例子:
let content = '插入的内容'
let h1 = 我是通过JSX创建的元素+ {content}
注意点:
根据不同的条件来渲染不同的JSX结构
let isLoading = true
let loading = ()=>{if(isLoading){return Loading...}return 加载完成
}
可以发现,写JSX的条件渲染与我们之前编写代码的逻辑是差不多的,根据不同的判断逻辑,返回不同的 JSX结构,然后渲染到页面中
let arr = [{id:1,name:'三国演义'
},{id:2,name:'水浒传'
},{id:3,name:'西游记'
},{id:4,name:'红楼梦'
}]
let ul = ({arr.map(item => - item.id}>{item.name}
)}
)
ReactDOM.render(ul,document.getElementById('root'))
在style里面我们通过对象的方式传递数据
item.id} style={{'color': 'red',"backgroundColor": 'pink'}}>{item.name}
这种方式比较的麻烦,不方便进行阅读,而且还会导致代码比较的繁琐
创建CSS文件编写样式代码
.container {text-align: center
}
在js中进行引入,然后设置类名即可
import './css/index.css'item.id} style={{'color': 'red',"backgroundColor": 'pink'}}>{item.name}
编写函数组件
function Hello() {return (这是第一个函数组件)
}
利用ReactDOM.render()进行渲染
ReactDOM.render( ,document.getElementById('root'))
创建class类,继承React.Component,在里面提供render方法,在return里面返回内容
class Hello extends React.Component{render(){return (这是第一个类组件)}
}
通过ReactDOM进行渲染
ReactDOM.render( ,document.getElementById('root'))
组件作为一个独立的个体,一般都会放到一个单独的JS文件中
创建Hello.js
在Hello.js 中导入React,创建组件,在Hello.js中导出
import React from 'react'export default class extends React.Component {render(){return (单独抽离出来的 Hello)}
}
在index.js中导入Hello组件,渲染到页面
import Hello from './js/Hello'
ReactDOM.render( ,document.getElementById('root'))
React事件绑定语法与DOM事件语法相似
语法:on+事件名称=事件处理函数
,比如 onClick = function(){}
注意:React事件采用驼峰命名法
export default class extends React.Component {clickHandle(e){console.log('点了')}render(){return ()}
}
合成事件
stopPropagation()
和 preventDefault()
nativeEvent
属性来进行获取export default class extends React.Component {clickHandle(e){// 获取原生事件对象console.log(e.nativeEvent)}render(){return ()}
}
Clipboard Events 剪切板事件
compositionEvent 复合事件
Keyboard Events 键盘事件
Focus Events 焦点事件 (这些焦点事件在 React DOM 上的所有元素都有效,不只是表单元素)
Form Events 表单事件
Mouse Events 鼠标事件
事件名:
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp
Pointer Events 指针事件
事件名:
onPointerDown onPointerMove onPointerUp onPointerCancel onGotPointerCapture
onLostPointerCapture onPointerEnter onPointerLeave onPointerOver onPointerOut
Selection Events 选择事件
Touch Events 触摸事件
UI Events UI 事件
Wheel Events 滚轮事件
事件名:onWheel
属性:
number deltaMode
number deltaX
number deltaY
number deltaZ
Media Events 媒体事件
事件名:
onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncrypted
onEnded onError onLoadedData onLoadedMetadata onLoadStart onPause onPlay
onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend
onTimeUpdate onVolumeChange onWaiting
Image Events 图像事件
Animation Events 动画事件
Transition Events 过渡事件
Other Events 其他事件
函数组件又叫做 无状态组件,类组件又叫做 有状态组件
状态(state) 即数据
函数组件没有自己的状态,只负责数据展示
类组件有自己的状态,负责更新UI,让页面动起来
私有
数据,只能在组件内部使用export default class extends React.Component {constructor(){super()// 第一种初始化方式this.state = {count : 0}}// 第二种初始化方式state = {count:1}render(){return (计数器 :{this.state.count})}
}
状态是可变的
语法:this.setState({要修改的数据})
export default class extends React.Component {// 第二种初始化方式state = {count:1}render(){return (计数器 :{this.state.count})}
}
当我们把上面代码的事件处理程序抽取出来后,会报错,找不到this
原因
在JSX中我们写的事件处理函数可以找到this,原因在于在JSX中我们利用箭头函数,箭头函数是不会绑定this,所以会向外一层去寻找,外层是render方法,在render方法里面的this刚好指向的是当前实例对象
利用箭头函数自身不绑定this的特点
利用原型bind方法是可以更改函数里面this的指向的,所以我们可以在构造中调用bind方法,然后把返回的值赋值给我们的函数即可
class App extends React.Component {constructor() {super()...// 通过bind方法改变了当前函数中this的指向this.onIncrement = this.onIncrement.bind(this)}// 事件处理程序onIncrement() {...}render() {...}
}
利用箭头函数形式的class实例方法
注意:该语法是实验性语法,但是,由于babel的存在可以使用
class App extends React.Component {state = {count: 0,};// 事件处理程序handleClick = () => {console.log("单击");this.setState({count: this.state.count + 1,});};render() {return ;}
}
ReactDOM.createRoot(document.getElementById("root")).render( );
如有不足,请多指教,
未完待续,持续更新!
大家一起进步!