[~]# npx create-react-app demo
[~]# cd demo
README.md node_modules package-lock.json package.json public src
[~]# npm start # 可以查看是否可以正常访问
npm install antd --save
npm install --save react-router
如果构建简单应用,则在App.js中添加即可
如果构建复杂应用,则建议新建组件目录,App.js仅仅负责组装组件页面
import ReactDOM from 'react-dom';
const App = <h1>App</h1>
ReactDOM.render(
(<App />),
document.getElementById('root')
)
在react中, 页面的渲染通过构建虚拟Dom树, 当有数据更新时,仅仅需要更新某一个节点以下的节点即可,这种渲染方式提升了性能
const App = <h1>App</h1>
JSX表示使用xml格式来表示Dom树,在JSX中使用{}来传递变量值
// function
function App(props){
// props是数据传递通道,由父组件传递,组件之间通信的工具
return <h1>App {props.info}</h1>
}
<App info="hello"/>
import React from 'react';
// class
class App extends React.Component{
constructor(props) {
super(props);
// props是数据传递通道,由父组件传递,组件之间通信的工具
}
render() {
return <h1>App {this.props.info}</h1>
}
}
<App info="hello"/>
import React from 'react';
// class
class App extends React.Component{
constructor(props) {
super(props);
this.date = {
date: new Data()
}
}
render() {
return <h1>App {this.props.info}</h1>
}
}
import React from 'react';
class A extends React.Component {
constructor(props) {
super(props);
this.state = {
date: new Date() // 定义时间对象变量,该变量在类中均可使用,在该变量发生更新时,本节点元素重新渲染
}
}
fresh_time() {
// 修改this.state, 更新是异步的
this.setState(
{ date: new Date() }
)
}
componentDidMount() {
// 当组件被挂载时,执行的方法
// 挂载成功时,我们设置一个定时器,让其修改变量state.date, 以实现页面动态渲染
this.time_interval = setInterval(
() => this.fresh_time(), 1000
)
}
componentWillUnmount() {
// 当组件被卸载时,执行的方法
clearInterval(this.time_interval) // 当组件卸载时,将定时器清除掉
}
render() {
return (
<p>现在时间是 {this.state.date.toLocaleTimeString()}</p>
)
}
}
import React from 'react';
class App extends React.Component {
constructor() {
super()
this.state = {
bool_value: true
}
}
handleClick = () => {
this.setState({
// 设置布尔值,将其取反
bool_value: !this.state.bool_value
})
console.log(this.state.bool_value)
}
render() {
return (
<div>
<button onClick={this.handleClick}>点我取反</button>
<p>当前布尔值:{this.state.bool_value.toString()}</p>
</div>
)
}
}
import React, { useState } from "react";
function App() {
let [bool_value, setBoolValue] = useState(true)
const handleClick = () => {
// 设置布尔值,将其取反
setBoolValue(
bool_value = !bool_value
)
console.log(bool_value)
}
return (
<div>
<button onClick={handleClick}>点我取反</button>
<p>当前布尔值:{bool_value.toString()}</p>
</div>
)
}
function App() {
let [color, setColor] = useState("red")
function handleClick() {
if (color == "red") {
setColor(
color = "blue"
)
} else {
setColor(
color = "red"
)
}
}
return (
<div>
<button onClick={handleClick}>点我变字体颜色</button>
{/* 条件渲染,使用{}来实现,示例中使用了三目运算,也可以将该条件渲染,封装为函数,使用if...else...语句 */}
{color == "red" ? <p style={{ color: color }}>我是红色的字体</p> : <p style={{ color: color }}>我是蓝色字体</p>}
</div>
)
}
function Main() {
let eleRef = React.createRef() // 用ref标记Dom元素,并应用它
let [textValue, setTextValue] = useState("")
function handleClick() {
console.log(eleRef.current)
console.log(eleRef.current.value)
setTextValue(textValue = eleRef.current.value)
}
function handleChange() {
setTextValue(textValue = eleRef.current.value)
}
return (
<div>
<input type="text" ref={eleRef} onClick={handleClick} onChange={handleChange}></input>
<p>{textValue}</p>
</div>
)
}
let ColorContext = React.createContext("red") // 全局设置颜色控制器, 其他组件需要使用该变量值,则用Consumer来获取即可
function MyText() {
return (
// 从Context中取color值
<ColorContext.Consumer>
{
(color) =>
<div>
<p style={{ color: color }}>颜色控制</p>
</div>
}
</ColorContext.Consumer>
)
}
function Main() {
let [color, setColor] = useState("red")
function handleClick() {
if (color == "red") {
setColor(
color = "blue"
)
} else {
setColor(
color = "red"
)
}
}
return (
// 这里向Context中生产数据,当数据更新时,则子组件则同步更新
<ColorContext.Provider value={color}>
<button onClick={handleClick}>点我控制字体颜色</button>
<MyText></MyText>
</ColorContext.Provider>
)
}
function App() {
let [color, setColor] = useState("red") // 定义变量,返回变量值与修改变量值的方法
function handleClick() {
if (color == "red") {
setColor(
color = "blue"
)
} else {
setColor(
color = "red"
)
}
}
// useEffect 将在渲染后执行
useEffect(() => {
console.log(color)
})
return (
<div>
<button onClick={handleClick}>点我控制字体颜色</button>
{color}
</div>
)
}
npm install --save-dev typescript # 安装typescript
npm i --save-dev @types/react # 安装react的typescript支持
import React from 'react'
export function App() {
return (
<div>
你好
</div>
)
}
npx create-react-app my-app --template typescript
import React from 'react';
import logo from './logo.svg';
import './App.css';
interface Props {
name: string;
}
function Main(props:Props){
console.log(props)
return (
<div>
<p>我是 {props.name}</p>
</div>
)
}
function App() {
return (
<Main name="man"/>
);
}
export default App;
import React from 'react';
import { Button } from 'antd';
import './App.css';
const App = () => (
<div className="App">
<Button type="primary">Button</Button>
</div>
);
export default App;
export class SiderNav extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Menu
defaultSelectedKeys={["1"]}
// mode="inline"
theme="dark"
>
<Menu.Item key="1" icon={<PieChartOutlined />}>
<Link to="/us">关于我们</Link>
</Menu.Item>
<Menu.Item key="2" icon={<DesktopOutlined />}>
<Link to="/info">信息通知</Link>
</Menu.Item>
</Menu>
</div>
);
}
}
export class AboutUs extends React.Component {
render() {
return (
<div
className="site-layout-background"
style={{ padding: 24, minHeight: 360 }}
>
这里是关于我们
</div>
);
}
}
export class AboutInfo extends React.Component {
render() {
return (
<div
className="site-layout-background"
style={{ padding: 24, minHeight: 360 }}
>
详细信息
</div>
);
}
}
function App() {
return (
// v5
//
// {/* nihai */}
//
//
//
// v6
<div>
<Router>
<Layout style={{ minHeight: "100vh" }}>
<Sider collapsible>
<SiderNav></SiderNav>
</Sider>
<Layout>
<Header
className="site-layout-sub-header-background"
style={{ padding: 0 }}
/>
<Content style={{ margin: "24px 16px 0" }}>
<Routes>
<Route path="/" element={<AboutInfo />} />
<Route path="us" element={<AboutUs />} />
<Route path="info" element={<AboutInfo />} />
</Routes>
</Content>
<Footer style={{ textAlign: "center" }}>
Ant Design ©2018 Created by Ant UED
</Footer>
</Layout>
</Layout>
</Router>
</div>
);
}
export default App;