如何在 React 创建门户中包含样式

How to include styles in React create portal

我有 ViewAllGraphs class:

import '../styles/Graph.css'
export class ViewAllGraphs extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            showWindowPortal: false,
}

和渲染方法:

return (
            <div>
                {
                    this.state.showWindowPortal && (
                        <Graph closeWindowPortal={this.closeWindowPortal} >
                            <h1>Id графика : {this.state.currentId}</h1>
                            <h1>Название графика : {this.state.currentTitle}</h1>
                            <img o src={`data:image/png;base64,${this.state.currentImage}`} />
                            <h1>Данные графика : {this.state.currentData}</h1>
                            <button className="graph-button-close" onClick={() => this.closeWindowPortal()} >
                                Закрыть график
                        </button>
                        </Graph>
                    )
                }
</div>

我的 CSS 文件位于 ../styles/Graph.css

我想设计我的图形组件的样式,例如按钮。这是这个组件的代码:

import React from "react";
import ReactDOM from 'react-dom'
import '../styles/Graph.css'

class Graph extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            id: 0,
        }
        this.containerEl = null;
        this.externalWindow = null;
    }
    componentDidMount() {
        this.externalWindow = window.open('', '');
        this.containerEl = this.externalWindow.document.createElement('div');
        this.externalWindow.document.body.appendChild(this.containerEl);
        this.externalWindow.document.title = 'A React portal window';
        this.externalWindow.addEventListener('beforeunload', () => {
            this.props.closeWindowPortal();
        });

        this.shouldComponentUpdate();
        this.setState({
            id: 1,
        })
    }
    shouldComponentUpdate() {
        return true;
    }

    componentWillUnmount() {
        this.externalWindow.close();
    }

    render() {
        if (!this.containerEl) {
            return null;
        }
        else
            return ReactDOM.createPortal(this.props.children, this.containerEl);
    }
};

export default Graph

我正在尝试包含 CSS 文件并将渲染方法中的 className="graph-button-close" 应用到我的按钮,但它不起作用。为什么我不能将 CSS 文件导入图表 class?

您可以试试这些代码:

    this.containerEl = this.externalWindow.document.createElement('div');
    this.containerEl.className = 'image';
    this.containerEl.style.backgroundImage = 'url(http://via.placeholder.com/350x150)';
    // add the image to its container; add both to the body
    // this.containerEl.appendChild(img);
    this.externalWindow.document.body.appendChild(this.containerEl);

或者对于当前元素,您可以在父组件中使用内联样式

let styleConfig = { backgroundColor: 'blue' }

在渲染方法中:

 <p style={styleConfig}>Данные графика : {this.state.currentData}</p>

要在功能上设置组件样式,我希望这也适用于 Class 组件,对于文件顶部的样式部分,我将样式作为组件导入,如下所示,

import componentStyling from '../styles/Graphs.css`;

一点建议是,在 99% 的情况下,我希望样式仅适用于该组件。每次我为组件添加样式时,都很难想到唯一的 class 名称,因此我使用以下格式重命名我的 CSS 文件,classComponentName.module.cssclassComponentName.module.scss,如果你使用 SCSS.

因此,无论您制作的组件的名称是什么,无论是功能组件还是 class 组件,请根据该名称命名您的 CSS 文件,然后在其后缀添加 .module.css.

现在,导入看起来像这样,

import componentStyling from `../styles/Graphs.module.css`;

现在,在组件的渲染部分,只要我想将 Graphs.module.css 中的 class 应用到我拥有的组件中的 HTML 组件,我只需写下,

<htmlElement className={componentStyling.classNameFromTheStylesFile}>
{/* some more JSX here */}
</htmlElement>

其中 classNameFromTheStylesFile 是存在于 Graphs.module.css 中的 class 名称,例如,

.classNameFromTheStylesFile {
    background-color: blue;
};

希望我答对了问题。

干杯!