React-其它内容-Portals 和 React-父子组件通讯-类组件

简介: React-其它内容-Portals 和 React-父子组件通讯-类组件
  • 默认情况下, 所有的组件都是渲染到 root 元素中的
  • Portal 提供了一种将组件渲染到其它元素中的能力

Portals 是根据 ReactDOM 的 createPortal 所得到的,createPortal 接收两个参数:

  • 第一个参数: 需要渲染的内容
  • 第二个参数: 渲染到什么地方

还可以通过 this.props.children 获取到当前组件所有的子元素或者子组件:


App.js:

import React from 'react';
import ReactDOM from 'react-dom';
class Modal extends React.PureComponent {
    render() {
        return ReactDOM.createPortal(this.props.children, document.getElementById('other'));
    }
}
class App extends React.PureComponent {
    render() {
        return (
            <div id={'app'}>
                <Modal>
                    <div id={'modal'}>Modal</div>
                </Modal>
            </div>
        )
    }
}
export default App;

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <meta name="theme-color" content="#000000"/>
    <meta
            name="description"
            content="Web site created using create-react-app"
    />
    <title>React App</title>
</head>
<body>
<div id="root"></div>
<div id="other"></div>
</body>
</html>

官方文档:https://zh-hans.reactjs.org/docs/portals.html




父子组件通讯-类组件


本文是延续上一篇文章继续的

  • 类组件的参数传递和函数式组件都是同一个世界同一个梦想的没有区别
  • 类子组件接收参数相比有点不一样

首先将 Header.js 改造为类组件:

import React from 'react';
import './Header.css';
class Header extends React.Component {
    render() {
        return (
            <div className={'header'}>我是头部</div>
        )
    }
}
export default Header;


在类组件当中接收其实会自动将 props 对象传递给构造函数当中,然后在调用 super() 传递给父构造函数即可,不用再当前类当中在定义一个 props 去接收和保存了,以为父类当中已经有了 props 所以我们就无需在进行保存了。


Header.js:

import React from 'react';
import './Header.css';
class Header extends React.Component {
    constructor(props) {
        super(props);
    }
    render() {
        console.log(this.props);
        return (
            <div className={'header'}>我是头部</div>
        )
    }
}
export default Header;


App.js:

import React from 'react';
import './App.css';
import Footer from "./components/Footer";
import Main from "./components/Main";
import Header from "./components/Header";
class App extends React.Component {
    render() {
        return (
            <div>
                <Header name={'yangbuyiya'} age={'18'}/>
                <Main/>
                <Footer/>
            </div>
        )
    }
}
export default App;




子组件设置参数默认值


类子组件与函数子组件设置默认值都是同一个梦想同一个世界的,参考之前的文章即可。

Header.js:

import React from 'react';
import './Header.css';
class Header extends React.Component {
    constructor(props) {
        super(props);
    }
    render() {
        console.log(this.props);
        return (
            <div className={'header'}>我是头部</div>
        )
    }
    static defaultProps = {
        name: '小灰灰',
        age: 18
    }
}
export default Header;

App.js:

import React from 'react';
import './App.css';
import Footer from "./components/Footer";
import Main from "./components/Main";
import Header from "./components/Header";
class App extends React.Component {
    render() {
        return (
            <div>
                <Header/>
                <Main/>
                <Footer/>
            </div>
        )
    }
}
export default App;




子组件中校验参数类型


类子组件与函数子组件校验参数类型都是同一个梦想同一个世界的,参考之前的文章即可。

Header.js:

import React from 'react';
import './Header.css';
import ReactTypes from "prop-types";
class Header extends React.Component {
    constructor(props) {
        super(props);
    }
    render() {
        console.log(this.props);
        return (
            <div className={'header'}>我是头部</div>
        )
    }
    static defaultProps = {
        name: '小灰灰',
        age: 18
    }
    static propTypes = {
        name: ReactTypes.string,
        age: ReactTypes.number
    }
}
export default Header;


最后


本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
4月前
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
211 68
|
4月前
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
193 67
|
4月前
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
194 62
|
7月前
|
移动开发 前端开发 API
React 音频播放器组件 Audio Player
本文介绍如何使用React创建音频播放器组件,涵盖核心功能如播放/暂停、进度条、音量控制和时间显示。通过HTML5 `&lt;audio&gt;` 元素和React的声明式状态管理,实现交互式音频播放。常见问题包括控件不响应、进度条无法更新和音量控制失灵,并提供解决方案。此外,还讨论了浏览器兼容性、异步错误处理和性能优化等易错点及避免方法。
569 123
|
6月前
|
前端开发 JavaScript
除了使用Route组件,React Router还有其他方式处理404错误页面吗
除了使用Route组件,React Router还有其他方式处理404错误页面吗
167 58
|
6月前
|
前端开发
React 中高阶组件的原理是什么?
React 中高阶组件的原理是什么?
179 57
|
6月前
|
前端开发 开发者
除了函数组件和类组件,React 还有其他创建组件的方式吗?
除了函数组件和类组件,React 还有其他创建组件的方式吗?
150 57
|
6月前
|
前端开发
如何在React Router中定义404错误页面组件?
如何在React Router中定义404错误页面组件?
157 57
|
6月前
|
前端开发
在 React 中使用高阶组件时,如何避免命名冲突?
在 React 中使用高阶组件时,如何避免命名冲突?
157 56
|
6月前
|
移动开发 前端开发 JavaScript
React音频播放列表组件:常见问题、易错点与解决方案
本文介绍了在React中实现音频播放列表时常见的挑战及解决方案。通过基础实现、常见问题分析和最佳实践,帮助开发者避免状态管理、生命周期控制和事件处理中的陷阱。关键点包括使用`useRef`操作音频元素、`useState`同步播放状态、全局状态管理防止多音频同时播放、以及通过`useEffect`清理资源。还提供了代码示例和跨浏览器兼容性处理方法,确保高效实现功能并减少调试时间。
206 30