安装和创建项目
安装
安装react手脚架:
npm install create-react-app -g
创建项目:
create-react-app demo
进入文件夹并执行项目:
cd demo
npm start
创建基础目录
-
删除在
src
目录下所有文件 -
src
目录下新建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( <React.StrictMode> <App /> </React.StrictMode> );
-
创建
App.js
作为入口组件//1、导入React核心模块 import React from 'react' //2、定义组件类 class Hello extends React.Component{ //类 render(){ //函数 return ( //返回值 <div> hello world !!! 我是组件222 </div> ) } } //3、导出组件 export default Hello
-
创建
pages
文件夹放置页面组件,创建assets
文件夹放置图片等静态文件,创建components
文件夹放置公共组件
安装插件和库
使用scss
安装sass-loader和node-sass就直接可以创建scss文件直接使用
npm install sass-loader node-sass -S
采用 Normalize.css 初始化样式
安装
npm install Normalize.css
安装成功后,在src/pages下的index.js中:
//重置样式
import 'normalize.css'
安装react-router和创建路由文件
// 安装
npm install react-router-dom
// 创建src/router文件夹
mkdir router
cd router
mkdir index.js
路由文件 index.js
import {
BrowserRouter, Route, Routes, Navigate } from "react-router-dom"
import Home from "../pages/home";
import Query from "../pages/query";
import Details from "../pages/details";
import Item from "../pages/item";
export default function Router() {
return (
<BrowserRouter>
{
/* 使用 Routes 替换曾经的 Switch */}
<Routes>
<Route path='/' element={
<Home />} />
<Route path='/query' element={
<Query />} />
<Route path='/details' element={
<Details />} >
<Route path='item/:id' element={
<Item />} />
</Route>
{
/* 重定向到首页 */}
<Route path="*" element={
<Navigate to="/" />} />
</Routes>
</BrowserRouter>
);
}
src/index.js文件修改为
import React from 'react';
import ReactDOM from 'react-dom/client';
import Router from "./router"
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Router />
</React.StrictMode>
);
安装react-redux
npm install react-redux
mkdir store
react 18基础语法
组件化开发
简单创建组件
组件开发分为两种类组件开发和函数组件开发
类组件开发简单模板
//1、导入React核心模块
import React from 'react'
//2、定义组件类
class Hello extends React.Component{
//类
render(){
//函数
return ( //返回值
<div>
hello world !!! 我是组件222
</div>
)
}
}
//3、导出组件
export default Hello
函数组件开发简单模板
// 写法一
export default const Hello = (props) => {
return <div>{
props.message}</div>
}
// 写法二
export default const Hello = props => <div>{
props.message}</div>
// 写法三
export default function Hello(props) {
return <div>{
props.message}</div>
}
注意点:
-
定义组件的时候,return 后面只能有一个根标签,不能有多个,但这个标签内部可以有其他多个标签
-
使用组件的时候,首字母必须大写
JSX语法糖
React 使用 JSX 来替代常规的 JavaScript。JSX 是一个看起来很像 XML 的 JavaScript 语法扩展,在React中会被babel编译为JavaScript。
JSX的特点:
- JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
- 它是类型安全的,在编译过程中就能发现错误。
- 使用 JSX 编写模板更加简单快速。
JSX几个注意的格式:
-
React的JSX是使用大写和小写字母来区分本地组件和HTML组件
(如:html就用 div p h1 , 组件就用 MyButton App Home List等 )
-
JSX和html的标签属性的区别
HTML标签属性 JSX 原因 for htmlFor for在JS中为for循环关键字 class className class在JS中为声明类关键字 style 需使用JS对象(使用双花括号–{ {}}) <div> <p style={ { backgroundColor: "#ccc"}}> hello world !!! 我是组件2223 </p> <img src={ MyImg} alt="" className="img1" /> <br/> <label htmlFor="username">用户名: <input type="text" id="username"/> </label> </div>
JSX变量引用、三目运算符、for循环
- 调用变量,需要在return中直接使用单花括号-- **{}**调用
- 三目运算符直接在**{}**使用(做为 v-if 是否显示组件)
- for循环使用
数组名.map(函数)
(做为 v-for 循环显示组件)
import React, {
Component } from 'react'
let name = "小明", num1=20, num2=30, arr=[1, 2, 3, 4, 5]
export default class App3 extends Component {
render() {
return (
<div>
{
/* 这是注释的格式 */}
{
/* JSX中引用变量需要加单花括号 */}
<p>{
name}</p>
{
/* 三目运算符的使用 */}
<p>num1和num2中比较大的是:{
num1>num2? num1: num2}</p>
{
/* for循环的使用 */}
<ul>
{
/* 数组名.map(函数) */}
{
//格式1:
arr.map((v,k)=>(
<li key={
k}>{
v}</li>
)
)
}
{
//格式2:可以把上面的大括号和return换成小括号
arr.map((v,k)=>{
return <li key={
k}>{
v}</li>
}
)
}
</ul>
</div>
)
}
}
组件状态 state 的基本使用
类组件
组件状态this.state的基本使用总结:
-
在构造函数定义状态数据
constructor(props){ super(props) this.state = { num: 20 } }
-
在jsx标签里使用状态数据
return ( <div> <p>{ this.state.num}</p> </div> )
-
在方法里修改数据(注意只能使用this.setState修改数据,不像vue,react不会监听数据)
// 1、通过事件或者定时器触发: <button onClick={ this.handleClick.bind(this)}>点击增加1</button> // 2、在事件函数中: this.setState({ num: this.state.num+1 })
函数组件
import React, {
useState } from "react"
export default function Query() {
// 1.定义状态
const [num, setNum] = useState(0);
const add = function () {
// 3.修改数据
setNum(num + 1)
}
return (
<div>
<h1>Query</h1>
<span>2.使用状态数据:num的值:{
num}</span>
<button onClick={
add}></button>
</div>
)
}
事件的使用
类组件
- 在类里定义方法 handleClick
- 在jsx 的标签属性里使用 οnclick={this.handleClick} 调用
import React, {
Component } from 'react'
// 1、实现点击弹框效果(事件基本格式)
export default class App4 extends Component {
handleClick(e){
alert(132456)
}
render() {
return (
<div>
<button onClick={
this.handleClick}>按钮</button>
</div>
)
}
}
// <button onClick={this.handleClick.bind(this)}>按钮</button>
注意:方法中想使用组件的属性和方法(this
调用),一定要使用.bind(this)
改变this的指向,不然this指向的是这个方法,不是这个组件
实现双向数据绑定:
export default class App4 extends Component {
constructor(props){
super(props)
this.state = {
str1: "123"
}
}
handleChange(e){
console.log(e)
console.log(e.target)
this.setState({
str1: e.target.value
})
}
render() {
return (
<div>
<input type="text" onChange={
this.handleChange.bind(this)}/>
<p>{
this.state.str1}</p>
</div>
)
}
}
函数组件
- 在函数里定义方法 handleClick
- 在jsx 的标签属性里使用 οnclick={handleClick} 调用
不用考虑this了
import React, {
useState } from "react"
export default function Query() {
const handleClick= function(e){
alert(132456)
}
return (
<div>
<button onClick={
handleClick}>按钮</button>
</div>
)
}
实现双向数据绑定:
import React, {
useState } from "react"
export default function Query() {
const [num, setNum] = useState(0);
const handleChange= function(e){
setNum(e.target.value)
}
return (
<div>
<input type="text" onChange={
handleChange}/>
<p>{
num}</p>
</div>
)
}
组件属性 props 的基本使用
props 的作用就是接受父组件传输过来的值
类组件
props基本使用 总结:
-
在父组件中使用子组件的时候,可以给组件设定属性的值
<组件名 属性名=值 /> // 例如: <Header title="首页" bgc="green"/>
-
在定义子组件的时候,需要填入值的位置书写 this.props.属性名 来获取定义的值
<div style={ { height:40, backgroundColor:this.props.bgc, textAlign:"center", color:"#fff" }}> { this.props.title} </div>
-
在子组件内部可以定义默认值
class Header extends React.Component{ // 定义默认值 static defaultProps = { 属性名:默认值, bgc : "blue",