React由Meta公司研发,是一个用于 构建Web和原生交互界面的库
创建react项目
npm install -g create-react-app
npx create-react-app 项目名
JSX
概念:JSX是JavaScript和XML(HTML)的缩写,表示在JS代码中编写HTML模版结构,它是React中编写UI模版的方式
首页渲染
index.js
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
App.js
function App() {
return <div className="App">this is App</div>;
}
export default App;
JSX中使用JS表达式
在JSX中可以通过 大括号语法{} 识别 JavaScript中的表达式,比如常见的变量、函数调用、方法调用等等
- 使用引号传递字符串
- 使用JavaScript变量
- 函数调用和方法调用
- 使用JavaScript对象
const count = 100
function getName () {
return 'jack'
}
function App() {
return (
<div className="App">
this is App
{/* 使用引号传递字符串 */}
{'this is message'}
{/* 识别js变量 */}
{count}
{/* 函数调用 */}
{getName()}
{/* 方法调用 */}
{new Date().getDate()}
{/* 使用js对象 */}
<div style={{ color: 'red' }}>this is div</div>
</div>
);
}
export default App;
JSX中实现列表渲染
const list = [
{ id: 1001, name: 'Vue' },
{ id: 1002, name: 'React' },
{ id: 1003, name: 'Angular' }
]
function App () {
return (
<div className="App">
this is App
<ul>
{list.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
</div>
)
}
export default App
JSX中实现条件渲染
const isLogin = true
function App () {
return (
<div className="App">
{/* 逻辑与 && */}
{isLogin && <span>this is span</span>}
{/* 三元运算 */}
{isLogin ? <span>jack</span> : <span>loading...</span>}
</div>
)
}
export default App
React 事件绑定
function App () {
// 基础绑定
// const handleClick = () => {
// console.log('button被点击了')
// }
// 事件参数e
// const handleClick = (e) => {
// console.log('button被点击了', e)
// }
// 传递自定义参数
// const handleClick = (name) => {
// console.log('button被点击了', name)
// }
// 既要传递自定义参数 而且还要事件对象e
const handleClick = (name, e) => {
console.log('button被点击了', name, e)
}
return (
<div className="App">
<button onClick={(e) => handleClick('jack', e)}>click me </button>
</div>
)
}
export default App
React组件
const Button = () => {
return <button>click me!</button>
}
function App() {
return (
<div className="App">
{/* 自闭和 */}
<Button />
{/* 成对标签 */}
<Button></Button>
</div>
)
}
export default App
useState
// useState实现一个计数器按钮
import { useState } from 'react'
function App () {
// 1. 调用useState添加一个状态变量
// count 状态变量
// setCount 修改状态变量的方法
const [count, setCount] = useState(0)
// 2. 点击事件回调
const handleClick = () => {
// 作用:
// 1. 用传入的新值修改count
// 2. 重新使用新的count渲染UI
setCount(count + 1)
}
return (
<div>
<button onClick={handleClick}>{count}</button>
</div>
)
}
export default App
修改状态的规则
import { useState } from 'react'
function App () {
let [count, setCount] = useState(0)
const handleClick = () => {
// 直接修改 无法引发视图更新
// count++
// console.log(count)
setCount(count + 1)
}
// 修改对象状态
const [form, setForm] = useState({ name: 'jack' })
const changeForm = () => {
// 错误写法:直接修改
// form.name = 'john'
// 正确写法:setFrom 传入一个全新的对象
setForm({
...form,
name: 'john'
})
}
return (
<div>
<button onClick={handleClick}>{count}</button>
<button onClick={changeForm}>修改form{form.name}</button>
</div>
)
}
export default App
样式绑定
// 导入样式
import './index.css'
const style = {
color: 'red',
fontSize: '50px'
}
function App () {
return (
<div>
{/* 行内样式控制 */}
<span style={style}>this is span</span>
{/* 通过class类名控制 */}
<span className="foo">this is class foo</span>
</div>
)
}
export default App