目录
一.表单受控绑定
二.React中获取DOM
三.发表评论
3.1核心功能实现
3.2id和时间处理
3.3清空内容和聚焦实现
四.组件通信
4.1父传子
4.1.1父传子-基础实现
4.1.2父传子-props说明
4.1.3父传子-chilren说明
4.2父子组件通信-子传父实现
五.使用状态提升实现兄弟组件通信
import { useState } from "react";
function A({onGetAName}){
const name = 'A'
return (
<div>
this is A compoment
<button onClick={()=> onGetAName(name)}>send</button>
</div>
)
}
function B ({name}){
return (
<div>
this is B compoment
{name}
</div>
)
}
function App() {
const [name,setName] = useState('')
const getAName = (name) => {
console.log(name);
setName(name)
}
return (
<div>
this is App
<A onGetAName={getAName}/>
<B name={name}/>
</div>
);
}
export default App;
六.使用context机制跨层传递数据
//App -> A -> B
import { createContext, useContext } from 'react';
//1.createContext方法创建一个上下文对象
const MsgContext = createContext()
//2.在顶层组件 通过Provider组件向组件树中注入数据
//3.在底层组件 通过useContext钩子函数使用数据
function A(){
return (
<div>
this is A compoment
<B />
</div>
)
}
function B (){
const msg = useContext(MsgContext)
return (
<div>
this is B compoment,{msg}
</div>
)
}
function App() {
const msg = 'this is app msg'
return (
<div>
<MsgContext.Provider value={msg}>
this is App
<A />
</MsgContext.Provider>
</div>
);
}
export default App;
七.useEffect
7.1useEffect-概念理解和基础使用
import { useEffect, useState } from 'react'
const URL = "http://geek.itheima.net/v1_0/channels";
function App() {
//创建一个状态函数
const [list,setList]=useState([])
useEffect(() => {
//获取频道列表
async function getList(){
const res = await fetch(URL)
const jsonRes = await res.json()
console.log(jsonRes);
setList(jsonRes.data.channels)
}
getList()
},[])
return(
<div>
this is App
<ul>
{list.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
</div>
)
}
export default App
7.2useEffect-不同依赖项说明
1.没有依赖项(初始 + 组件更新)
import { useEffect, useState } from 'react'
function App() {
//没有依赖项 初始+组件更新
const [count, setCount] = useState(0)
useEffect(() => {
console.log('副作用函数执行了');
})
return(
<div>
this is App
<button onClick={()=>{setCount(count+1)}}>+{count}</button>
</div>
)
}
export default App
2.空数组依赖(初始执行一次)
import { useEffect, useState } from 'react'
function App() {
const [count, setCount] = useState(0)
//传入空数组依赖 初始执行一次
useEffect(()=>{
console.log('副作用函数被调用');
},[])
return(
<div>
this is App
<button onClick={()=>{setCount(count+1)}}>+{count}</button>
</div>
)
}
export default App
3.添加特定依赖项(初始 + 依赖项变化时执行)
import { useEffect, useState } from 'react'
function App() {
const [count, setCount] = useState(0)
useEffect(()=>{
console.log('副作用函数被调用');
},[count])
return(
<div>
this is App
<button onClick={()=>{setCount(count+1)}}>+{count}</button>
</div>
)
}
export default App
7.3useEffect-清除副作用
import {useEffect, useState} from 'react'
function Son(){
//1.渲染时开启一个定时器
useEffect(()=>{
const timer = setInterval(()=>{
console.log('定时器执行中...');
},1000)
return ()=>{
//清除副作用(组件卸载时)
clearInterval(timer)
}
},[])
return <div>this is Son</div>
}
function App(){
//通过条件渲染模拟组件卸载
const [show, setShow]=useState(true)
return <div>
{show && <Son/>}
<button onClick={()=>{setShow(false)}}>卸载Son组件</button>
</div>
}
export default App
八.自定义Hook实现
问题: 布尔切换逻辑 当前组件耦合在一起 不方便复用
//封装自定义Hook
//问题: 布尔切换逻辑 当前组件耦合在一起 不方便复用
import {useState} from 'react'
function App () {
const [show , setShow] = useState(true)
const toggle = () => { setShow(!show) }
return (
<div>
{show && <div>this is div</div>}
<button onClick={toggle}>toggle</button>
</div>
)
}
export default App
解决思路:自定义Hook
//封装自定义Hook
//解决:组件复用,状态共享
import {useState} from 'react'
function useToggle(){
//可复用的逻辑代码
const [show , setShow] = useState(true)
const toggle = () => { setShow(!show) }
//哪些状态和回调函数需要在其他组件中使用 return
return {show , toggle}
}
function App () {
const {show,toggle}=useToggle()
return (
<div>
{show && <div>this is div</div>}
<button onClick={toggle}>toggle</button>
</div>
)
}
export default App
封装自定义hook通用思路
1.声明一个以use打头的函数
2.在函数体内封装可复用的逻辑(只要是可复用的逻辑)
3.把组件中用到的状态或者回调return出去(以对象或者数组)
4.在哪个组件中要用到这个逻辑,就执行这个函数,解构出来状态和回调进行使用
九.ReactHooks使用规则说明
十.案例优化
10.1使用useEffect获取数据
json-server:
npm安装->
创建一个db.json当做后端的数据->
在package.json里创建命令启动服务(在scripts里写:"serve":"json-serve db.json --port 3000")后面可以指定端口为3000也可以不写不指定->
命令行执行npm run serve执行命令