react class
import React, { Component } from "react";
export default class Button extends Component {
constructor() {
super();
this.state = { buttonText: "Click me, please" };
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(() => {
return { buttonText: "Thanks, been clicked!" };
});
}
render() {
const { buttonText } = this.state;
return <button onClick={this.handleClick}>{buttonText}</button>;
}
}
React Hooks 的设计目的,就是加强版函数组件,完全不使用"类",就能写出一个全功能的组件。 Hook 这个单词的意思是"钩子"。 React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。 React Hooks 就是那些钩子。
**React 16.8 版本之前** - 函数式组件中没有this,不能有自己的state,也不能有生命周期函数 - 类组件中可以有this,state,生命周期函数 **React 16.8之后** - 函数式组件加入了Hook, 仍然没有this - 但是函数式组件可以通过新的Hook来实现state和生命周期函数
-
useState useEffect useRef useContext -
useState用法
-
useState() 用于为函数组件引入状态(state)。纯函数不能有状态,所以把状态放在钩子里面。
-
-
import {useState} from 'react';
const Test = () => { // useState的参数为状态初始值 // useState的返回值是一个数组 // 数组第一个成员是变量,第二个成员是函数,用来更新状态,约定是set前缀加上状态的变量名 const [num,setNum] = useState(1) return ( <div> <div>访问num: {num}</div> <button onClick={()=>setNum(num+1)}>修改state</button> </div> ); } export default Test -
import { useState, useEffect } from 'react';
const Test = () => {
const [num, setNum] = useState(1)
const [msg, setMsg] = useState('a')
const [list, setList] = useState([])
//1. 只有个参数-------------------------------------
// 组件初始化自动执行一次,之后每更新一次执行一次
// 类似 componentDidUpdate
useEffect(()=>{
console.log('没有第二个参数,多次执行');
})
//2. 第二个参数为空数组-------------------------------
//等价于 componentDidMount , 只在初始化时执行一次
useEffect(()=>{
console.log('第二个参数为空数组,只执行一次');
},[])
// 3. 第二个参数为state------------------------------
// 初次执行后,只有该state改变时再次执行
useEffect(()=>{
console.log('第二个参数为state数据,数据改变一次执行一次');
},[num])
// 4.回调函数内部又return一个函数------------------------
//return的回调 等价于 componentWillUnmount() 组件卸载时
useEffect(()=>{
return ()=>{
console.log('组件卸载时');
}
},[])
return (
<div>
<div>访问num: {num}</div>
<button onClick={() => setNum(num + 1)}>修改num</button>
<hr/>
<div>访问msg: {msg}</div>
<button onClick={() => setMsg(msg + 'm')}>修改msg</button>
</div>
);
}
export default Test
在父组件中实现组件卸载
import Test from './Test' import { useState } from 'react'; const App = () => { const [flag,setFlag] = useState(true) return ( <div> {/* 单击按钮,卸载组件 */} <button onClick={()=>{setFlag(false)}}>删除Test</button> { flag ? <Test></Test> : null} </div> ); }
5.3 useRef
useRef用来保存引用值
使用useRef后,有一个.current属性, 该属性不会引发组件重新渲染。
保持临时变量不丢失(引用的闭包原理), 绑在dom或组件上方便实现组组件通信和dom节点的访问
import { useRef , useEffect} from "react";
const Test = () => {
//1. 创建引用实例
const btnRef = useRef()
useEffect(()=>{
//3. 通过实例的current属性即可访问DOM对象
btnRef.current.focus()
},[])
return (
<div>
{/* 2. 给DOM元素添加ref属性,值为useRef创建的实例 */}
<input type="text" ref={btnRef}/>
</div>
);
}
export default Test
如果需要在组件之间共享状态,可以使用useContext()
-
使用 React Context API,在组件外部建立一个 Context Context因为需要其它组件共享,所以要单独导出
export const AppContext = React.createContext()
利用父组件状态钩子,创建共享状态
const [city,setCity] = useState('郑州')
提供了一个 Context 对象,这个对象可以被子组件共享
<AppContext.Provider value={{city,setCity}}>
Test---{city}
<hr/>
<Child></Child>
</AppContext.Provider>
4、在后代组件中引入Context,
import {AppContext} from './Test'
5.useContext()钩子函数用来引入 Context 对象,从中获取所需要的状态
import React,{useContext} from 'react';
......
const {city,setCity} = useContext(AppContext)
完整案例 context.js import React from 'react' export const AppContext = React.createContext() Parent.js import { createContext, useState } from 'react' import Child from './Child' import { AppContext } from './context' const Parent = () => { const [city, setCity] = useState('郑州') return ( <AppContext.Provider value={{ city, setCity }}> Parent---{city} <hr /> <Child></Child> </AppContext.Provider> ); } export default Parent; Child.js import GrandSon from './GrandSon' const Child = () => { return ( <div> Child <hr/> <GrandSon></GrandSon> </div> ); } export default Child; import React, { useContext } from 'react'; import { AppContext } from './context' const GrandSon = () => { const { city, setCity } = useContext(AppContext) return ( <div> GrandSon-----{city} <div><button onClick={() => { setCity('广州') }}>改变城市</button></div> <hr /> </div> ); } export default GrandSon; GrandSon.js
本文来自博客园,作者:刘先生的爱心博客,转载请注明原文链接:https://www.cnblogs.com/liu521125/p/18083868
一点一滴记录着学习html5 css3 和js 的时光
浙公网安备 33010602011771号