和vue中v-model功能相同
import { useState } from "react";
// 通过value属性绑定react状态
// 绑定onChange事件 通过事件参数e拿到输入框最新的值 反向修改到react状态
function App() {
const [value, setValue] = useState('')
return (
setValue(e.target.value)}/>
);
}
export default App;
import { useRef } from "react";
//userRef生成ref对象 绑定到dom标签身上
//dom可用时,ref.current获取dom
function App() {
const inputRef = useRef(null)
const showDom = () => {
//console.log显示简单的文本信息 console.dir显示一个对象的详细信息
console.dir(inputRef.current)
}
return (
);
}
export default App;
即组件间数据传递
父组件 给子组件标签绑定属性
子组件 内部通过props接收
function Son(props){
//props包含父组件绑定在子组件标签上的所有数据
return(
{props.letter1}
{props.letter2}
)
}
function App() {
const letter1 = '我是消息1'
const letter2 = '我是消息2'
return (
);
}
export default App;
props可以传递数字、字符串、布尔值、数组、对象、函数、JSX
props传递的数据是只读的,不能修改
这个概念与vue的slot差不多
function Son(props){
return(
{props.letter1}
{props.letter2}
{props.children}
)
}
function App() {
const letter1 = '我是消息1'
const letter2 = '我是消息2'
return (
我是children属性内容
);
}
export default App;
在子组件属性中调用父组件函数
import { useState } from "react"
function Son({onGetMsg}){
const msg = 'i am son\'s msg'
return(
我是儿子
)
}
function App() {
const [value, setValue] = useState('')
const getMsg = (msg) => {
console.log(msg)
setValue(msg)
}
return (
我是爸爸{value}
);
}
export default App;
子传父 A -> APP
父传子APP->B
import { useState } from "react"
function A({onGetMsg}){
const msgA = 'message from A'
return(
i am A
)
}
function B(props){
return(
i am B
{props.msgfromA}
)
}
function App() {
const [message, setMessage] = useState('')
const getMsg = (msg) => {
console.log(msg)
setMessage(msg)
}
return (
);
}
export default App;
createContext机制
vue小链接:provide/inject依赖注入
import { useState, createContext, useContext } from "react"
//1 createContext创建一个上下文对象
const MsgContext = createContext()
function A(){
return(
i am A
)
}
function B(){
//3 底层组件用useContext接收消息
const msg = useContext(MsgContext)
return(
i am B
{msg}
)
}
function App() {
const msgfromGrandfather = 'grandfather\'s message'
return (
);
}
export default App;
vue小链接:生命周期函数mounted()
两个参数:回调函数(规定要干什么),依赖项数组(回调函数的执行时机,如果是空数组只执行一次)
import { useEffect, useState } from "react"
import axios from 'axios'
const URL = 'http://geek.itheima.net/v1_0/channels'
function App() {
const [list, setList] = useState([])
useEffect(() => {
function getList() {
axios.get(URL).then(res => {
const list = res.data
console.log(list)
setList(list.data.channels)
})
}
getList()
}, [])
return (
i am app
{list.map(item => {
return - {item.id} {item.name}
})}
);
}
export default App;
依赖项 | 回调函数执行时期 |
没有依赖项 | 组件初始渲染+组件更新时执行 |
空数组依赖 | 只在初始渲染时执行一次 |
添加特定依赖项 | 初始组件渲染+特定依赖项变化时执行 |
组件卸载时执行的操作,在useEffect的return中执行
vue小链接:生命周期函数beforeUnmounted
import { useEffect, useState } from "react"
function Son(){
useEffect(() => {
const timer = setInterval(() => {
console.log('定时器执行中...')
}, 1000)
return () => {
console.log('定时器已结束')
clearInterval(timer)
}
}, [])
return i am son
}
function App() {
const [show, setShow] = useState(true)
return (
{show && }
);
}
export default App;
需要复用的逻辑功能,可以单独封装一个函数(函数名一般用use开头)
import { useState } from "react"
function useToggle(){
const [toggle, setToggle] = useState(true)
const changeToggle = () => setToggle(!toggle)
return {
toggle,
changeToggle
}
}
function App() {
const style = {
backgroundColor:'pink',
height:'100px',
width:'100px'
}
const {toggle, changeToggle} = useToggle()
return (
{toggle && i am a big box}
);
}
export default App;
不允许在组件外使用
不允许在if语句、for循环、其他函数中使用,只能在组件顶层使用