react中的useRef和useContext

发布时间 2023-03-23 16:53:49作者: 抽风的皮鞭

1. useRef和useState类似,都是用来更新数据,但是useRef更新数据是同步的

useRef返回一个对象,初始化数据保存在current字段下

import {useRef} from 'react';

const data = useRef(0);
const obj = useRef({a: 1, b:1});

console.log(data); // {current:0}
console.log(obj); // {current:{a: 1, b: 1}} 

// 更新数据
data.current = 1;
obj.current = {...obj.current,b:2};

console.log(data); // {current:1}
console.log(obj); // {current:{a: 1, b: 2}} 

2. useContext用来实现子组件之间数据共享,共享的数据通过value属性传入子组件

import React,{useContext} from 'react';

const contextMsg = React.createContext();

function Father(){
   
    const [count,setCount] = useSate(0)

    return (
         <contextMsg.Provider value={{count,setCount}}>  
            <Child1 />
            <Child2 />
         </contextMsg.Provider>
    )
} 

function child1(){
    
    const {count,setCount} = useContext(contextMsg); // 注意useContext传入的参数是它本身

    useEffect(()=>{
        console.log(count); // 0
    },[])

    const add = ()=>{
        setCount(count+1); // 所有引用count的地方数据会同步更新到视图
    }
    return (
        <div onClick={add}>{count}</div>
    )
}       

function child2(){
    
    const {count,setCount} = useContext(contextMsg); // 注意useContext传入的参数是它本身

    useEffect(()=>{
        console.log(count); // 0
    },[])

    const add = ()=>{
        setCount(count+1); // 所有引用count的地方数据会同步更新到视图
    }
    return (
        <div onClick={add}>{count}</div>
    )
}   

通常我们可以新建一个context.js文件用来创建需要共享的数据

context.js

import React from 'react';

export const contextMsg = React.createContext();

在父组件以及共享数据的子组件里面需要用到的时候引入

Father.js

import {contextMsg} from '.../context.js';

function Father(){

   const [count,setCount] = useSate(0)

    return (
         <contextMsg.Provider value={{count,setCount}}>  
            <Child1 />
            <Child2 />
         </contextMsg.Provider>
    )
}

export defalut Father;

Child1.js

import {contextMsg} from '../context.js';

function Child1(){
    
    const {count,setCount} = useContext(contextMsg); // 注意useContext传入的参数是它本身

    useEffect(()=>{
        console.log(count); // 0
    },[])

    const add = ()=>{
        setCount(count+1); // 所有引用count的地方数据会同步更新到视图
    }
    return (
        <div onClick={add}>{count}</div>
    )
}  
export default Child1