day04-React-组件之间的通信&路由

一、父子组件之间的通信

二、子孙组件之间的通信

//Step1:在需要发送数据的一方,创建一个上下文环境的对象(context)
let context = createContext();
//返回一个对象,Consumer和Provider

//Step2:想要给哪一个后代组件传递数据,就对该组件进行包裹调用(任意后代,不是直接后代)
<context.Provider>
</context.Provider>

//Step3:接收数据

三、兄弟组件之间的通信

借助于第三方的包——pubsub
(组件挂载完成 ajax 订阅频道 操作DOM 定时器 四件事)
useEffect(()=>{} , [] )

父组件A——两个子组件B和C

import React from 'react';
import B from '../B/B'
import C from '../C/C'

export default function A() {
    return (
        <div style={{ width: 200, height: 200, backgroundColor: 'skyblue' }}>
            <h2>A</h2>
            <B></B>
            <C></C>
        </div>
    )
}

组件B

import React from 'react'
import PubSub from 'pubsub-js'

export default function B() {
    let sendMessage = () => {
    	//publish接收两个参数:第一个参数就是频道名称,第二个参数就是频道值
        PubSub.publish('message1', [1, 2, 3, 4, 5]);
    }
    return (
        <div style={{ width: 200, height: 200, backgroundColor: 'pink' }}>
            <h2>B</h2>
            <button onClick={sendMessage}>C组件传递数据</button>
        </div>
    )
}

组件C

import React, { useEffect, useState } from 'react'
import PubSub from 'pubsub-js'

export default function C() {
	//由于状态值的默认值是一个数组
    let [msg, setMsg] = useState([]);
    useEffect(() => {
        PubSub.subscribe('message1', (msg, data) => {
            console.log('频道名称:', msg);
            console.log('频道内容:', data);
            //return中不能访问变量data,故存储在状态值中
            setMsg(data);
        })
    }, [])
    return (
        <ul style={{ width: 200, height: 200, backgroundColor: 'orange' }}>
            {
                msg.map((item, index) => {
                    return <li key={index}>{item}</li>
                })
            }
        </ul>
    )
}

单页面应用

二级路由——使用内置Hooks

//Step1:
import {  useRoutes,Navigate  } from 'react-router-dom'

//Step2:配置路由表
{
      path: '/',
      element: <Index />
    },
    {
      path: '/home',
      element: <Home />,
      //路由中的大小写敏感
      caseSensitive:true,
      //二级路由
      children: [
        {
          path: '/home/news',
          element: <News />
        },
        {
         //显示一级路由中某一条默认的二级路由
          index: true,
          element: <Navigate to="/home/news" />
        }
      ]
    },

在这里插入图片描述

只要放在了public文件夹中,引入link / images时,一定要写/,不能写./或者什么都不写

Link和NavLInk本质上就是a标签

写法一:路由占位符

路由后退 useNavigate() 返回一个函数,一定要调用
替换模式(基本不用)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值