首页 > 其他分享 >2 Reac进阶

2 Reac进阶

时间:2024-04-27 18:22:54浏览次数:30  
标签:通讯 const 进阶 Reac item props 组件 好友

一 组件props

作用:给组件传递数据,是React组件通讯的基础

使用步骤:

1、传递props:在组件标签上添加属性

2、接收props:通过参数拿到

推荐:使用解构,接收props

二 父子组件通讯

原则:谁的数据谁负责

1、父=》子 (传递props)

父组件提供数据,通过props传递给子组件使用

2、子=》父

a、父组件准备修改数据的函数,传递给子组件

b、子组件调用函数,将数据作为参数回传给父组件

 三 兄弟组件通讯

1、找到父组件,提供共享数据

2、使用数据,例如聊天工具左边好友列表,右边聊天窗口,展示好友名称(父到子通讯)

3、修改数据,切换选中好友(子到父通讯)

状态提升:如果两个兄弟组件要通讯,就把共享数据提升到公共父组件中

import classNames from 'classnames'
import { useState } from 'react'
import './App.scss'

// 兄弟组件通讯

// 左侧 好友列表组件
const Friends = ({ friends, onSelect, chatFriend }) => {
  return (
    <div className="friends">
      {friends.map(item => {
        return (
          <div
            key={item.id}
            className={classNames(
              'friend',
              item.id === chatFriend.id && 'selected'
            )}
            onClick={() => onSelect(item)}
          >
            <img src={item.avatar} className="avatar" alt="" />
            <div className="info">
              <div className="row">
                <div className="name">{item.name}</div>
                <div className="date">{item.dateStr}</div>
              </div>
              <div className="msg">{item.message}</div>
            </div>
          </div>
        )
      })}
    </div>
  )
}

// 右侧 聊天窗口组件
const Chat = ({ friend }) => {
  return (
    <div className="chat-wrapper">
      <div className="header">{friend.name}</div>
      <div className="list"></div>
      <div className="input"></div>
    </div>
  )
}

// 好友列表数据
const defaultFriends = [
  {
    id: '13258165',
    name: '周杰伦',
    avatar:
      'https://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/reactbase/comment/zhoujielun.jpeg',
    dateStr: '刚刚',
    message: '哎呦,不错哦',
  },
  {
    id: '36080105',
    name: '许嵩',
    avatar:
      'https://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/reactbase/comment/xusong.jpeg',
    dateStr: '01/05',
    message: '[语音]',
  },
]
// 父组件
const App = () => {
  const [friends, setFriends] = useState(defaultFriends)

  // 1. 找到父组件,提供要共享的数据
  const [chatFriend, setChatFriend] = useState(friends[0])

  const onSelectFriend = friend => {
    setChatFriend(friend)
  }

  return (
    <div className="app">
      {/* 好友列表 */}
      {/* 3. 通过子到父通讯,来修改选中的好友 */}
      <Friends
        friends={friends}
        onSelect={onSelectFriend}
        chatFriend={chatFriend}
      />
      {/* 聊天窗口 */}
      {/* 2. 通过父到子通讯,来展示好友名称 */}
      <Chat friend={chatFriend} />
    </div>
  )
}

export default App
View Code

四 后代关系组件通讯

Context(上下文):范围,无视组件层级关系,跨组件通讯

1、创建Context对象

2、划定范围,提供共享数据

3、范围内的组件,获取共享数据 

标签:通讯,const,进阶,Reac,item,props,组件,好友
From: https://www.cnblogs.com/ai1988/p/18162213

相关文章

  • vue和react有什么区别?
    (1)核心思想不同 vue:灵活易用的渐进式框架,进行数据拦截/代理,它对侦测数据的变化更敏感、更精确 react:React推崇函数式编程(纯组件),数据不可变以及单向数据流,当然需要双向的地方也可以手动实现,比如借助onChange和setState来实现(2)组件写法差异 vue:Vue推荐的做法是template......
  • React 《useEffect》
    概念useEffect是一个ReactHook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用),比如发送AJAX请求,更改DOM等等:::warning说明:上面的组件中没有发生任何的用户事件,组件渲染完毕之后就需要和服务器要数据,整个过程属于“只由渲染引起的操作”:::基础......
  • ansible剧本进阶
    ansible剧本进阶一.剧本的高级特性剧本高级特性是完全遵循python的循环结构来的编程语言特有的逻辑控制语句变量循环等等你的剧本,可以考虑用高级特性,也可以不用高级特性是为了简化剧本比如,创建10个系统的用户不用循环手写ansiblebakcup-muser-a"name=cc01"an......
  • React 《组件间通信》
    React组件通信概念:组件通信就是组件之间的数据传递,根据组件嵌套关系的不同,有不同的通信手段和方法A-B父子通信B-C兄弟通信A-E跨层通信父子通信-父传子基础实现实现步骤父组件传递数据-在子组件标签上绑定属性子组件接收数据-子组件通过props参数接收数据......
  • React 《入门案例》
    一、案例二、创建项目npminitvite@latest#选择react#删除不必要的css,文件等#安装依赖classnames、sass、uuid、dayjs、lodashnpmi-Sclassnames#处理className属性npmi-Suuid#生成uuidnpmi-Sdayjs#日期处理npmi-Slodash#操作数组npmi-D......
  • E. Chain Reaction
    https://codeforces.com/contest/1954/problem/E题意:n个数,可以对每个数释放闪电,闪电从释放的位置一直传到左右边界或者传到某个小于等于0的数终止,并且每个数都会减去闪电值k。问最少多少次释放闪电后可以让所有的数小于等于0。思路:从左往右考虑,假设第一个数的权值为1,如果当前数>......
  • React 《常用库》
    lodashLodash通过降低array、number、objects、string等等的使用难度从而让JavaScript变得更简单。Lodash的模块化方法非常适用于:遍历array、object和string对值进行操作和检测创建符合功能的函数官网https://www.lodashjs.com/#installnpmi--savelodash......
  • react native cli 替换安卓应用图标
    1.拿到需要替换的logo图标,最好是1024×1024尺寸。2.根据原图生成不同尺寸的logo:有很多类似功能的网站,这里我使用的是图标工厂图标工厂地址:图标生成网站首先上传图片然后可以配置一些其他选项如圆角等等:上传后会看到预览效果:3.替换项目中的logo图标:找到图标位置:项......
  • Redis进阶 -
    之前已经总结了Redis的基础使用  springboot3+vue3(八)Redis基础使用--登录优化Redis进阶主要总结一下以下知识点:Redis持久化Redis主从Redis哨兵Redis分片集群 Redis单节点问题,以及解决方案:1、数据丢失问题(Redis是内存存储,服务器重启可能会丢失数据。)-----解决......
  • SpringCloud(十一)ES 进阶 -- ES集群
    单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。解决方案:海量数据存储问题:将索引库从逻辑上拆分为N个分片,存储到多个节点。单点故障问题:将分片数据在不同节点备份。(这样有一个点挂掉,还能保证数据是完整的,如图:比如说node1挂掉了,node1的主数据sh......