React 基础(一)React 初体验
React 是什么?
用于构建用户界面的 JavaScript 库
为什么需要 React?
- 原生 JavaScript 操作 DOM 繁琐、效率低(DOM-API 操作 UI)
- 使用 JavaScript 直接操作 DOM,浏览器会进行大量的重绘重排
- 原生 JavaScript 没有组件化编码方案,代码复用率低
React 的特点
- 采用组件化模式、声明式编码,提高开发效率及组件复用率
- 跨平台,在 React Native 中可以使用 React 语法进行移动端开发,还有 React VR
- 使用虚拟 DOM + 优秀的 Diff 算法,尽量减少与真实 DOM 的交互
开发 React 必须依赖三个库
- react:包含 react 所必须的核心代码
- react-dom:react 扩展库
- babel:将 JSX 转为 JavaScript
使用 JSX,必须设置 script 元素的 type 属性为 text/babel
第一个 React 程序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="root"></div>
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// react18之后:ReactDOM.createRoot().render
ReactDOM.createRoot(document.querySelector('#root')).render(
<h2>Hello World</h2>
)
</script>
</body>
</html>
Hello React
案例
<script type="text/babel">
let message = 'Hello World'
function onClick() {
message = 'Hello React'
render()
}
const root = ReactDOM.createRoot(document.querySelector('#root'))
function render() {
root.render(
<div>
<h2>{message}</h2>
<button onClick={onClick}>修改文本</button>
</div>
)
}
render()
</script>
类组件
<script type="text/babel">
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
message: 'Hello World'
}
}
onClick() {
this.setState({
message: 'Hello React'
})
}
render() {
return (
<div>
<h2>{this.state.message}</h2>
<button onClick={this.onClick.bind(this)}>修改文本</button>
</div>
)
}
}
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<App />)
</script>
函数组件(主流)
<script type="text/babel">
function App() {
const [message, setMessage] = React.useState('Hello World')
return (
<div>
<h2>{message}</h2>
<button onClick={() => setMessage('Hello React')}>修改文本</button>
</div>
)
}
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<App />)
</script>
列表渲染
<script type="text/babel">
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
movies: ['星际穿越', '火星救援', '流浪地球']
}
}
render() {
return (
<div>
<h2>电影列表</h2>
<ul>
{this.state.movies.map((movie) => {
return <li key={movie}>{movie}</li>
})}
</ul>
</div>
)
}
}
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<App />)
</script>
计数器
<script type="text/babel">
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
counter: 0
}
}
increment() {
this.setState({
counter: this.state.counter + 1
})
}
decrement() {
this.setState({
counter: this.state.counter - 1
})
}
render() {
return (
<div>
<h2>{this.state.counter}</h2>
<button onClick={this.increment.bind(this)}>+</button>
<button onClick={this.decrement.bind(this)}>-</button>
</div>
)
}
}
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<App />)
</script>