React - 18 React样式私有化处理

奋斗吧
奋斗吧
擅长邻域:未填写

标签: React - 18 React样式私有化处理 React.js博客 51CTO博客

2023-07-07 18:24:22 280浏览

React - 18 React样式私有化处理,在组件化开发的项目中,最后我们要把所有组件合并在一起进行渲染「SPA单页面应用」,这样就会存在一个问题:各组件之间的样式,可能会冲突,所以如何保持各组件之间的样式不冲突「样式私有化],则是组件化开发中必须要考虑的事情。目前5种方式1.内联样式每个组件不再单独引入自己的css文件,都写在各自的标签的style属性中偶尔使用,不能成为项目中的主流处理方式2.基于样式表、样式类名的方式(很多项目都在用

在组件化开发的项目中,最后我们要把所有组件合并在一起进行渲染「SPA单页面应用」,这样就会存在一个问题: 各组件之间的样式,可能会冲突,所以如何保持各组件之间的样式不冲突「样式私有化],则是组件化开发中必须要考虑的事情。

目前5种方式

1.内联样式

每个组件不再单独引入自己的css文件,都写在各自的标签的style属性中

React - 18 React样式私有化处理_react

React - 18 React样式私有化处理_react_02

偶尔使用,不能成为项目中的主流处理方式

React - 18 React样式私有化处理_react_03

2.基于样式表、样式类名的方式(很多项目都在用)

React - 18 React样式私有化处理_react_04

React - 18 React样式私有化处理_react_05

React - 18 React样式私有化处理_react_06

React - 18 React样式私有化处理_react_07

React - 18 React样式私有化处理_react_08

React - 18 React样式私有化处理_react_09

3.CSSModules

React - 18 React样式私有化处理_react_10

React - 18 React样式私有化处理_react_11

React - 18 React样式私有化处理_react_12

公共样式

React - 18 React样式私有化处理_react_13

全局样式,这样写就不会被webpack编译混淆类名了,可以作为全局样式使用

React - 18 React样式私有化处理_react_14

composes 组合(继承)某个类的样式

React - 18 React样式私有化处理_react_15

4.react-jss插件

React - 18 React样式私有化处理_react_16

React - 18 React样式私有化处理_react_17

React - 18 React样式私有化处理_react_18

import React from "react";
import { createUseStyles } from 'react-jss';
/* 
基于createUseStyles方法,构建组件需要的样式;返回结果是一个自定义Hook函数! 
  + 对象中的每个成员就是创建的样式类名
  + 可以类似于less等预编译语言中的“嵌套语法”,给其后代/伪类等设置样式!!
自定义Hook执行,返回一个对象,对象中包含:
  + 我们创建的样式类名,作为属性名
  + 编译后的样式类名「唯一的」,作为属性值
  {box: 'box-0-2-1', title: 'title-0-2-2', list: 'list-0-2-3'}
而我们在JS中编写的样式,最后会编译为:
    .box-0-2-1 {
        width: 300px;
        background-color: lightblue;
    }
    .title-0-2-2 {
        color: red;
        font-size: 20px;
    }
    .title-0-2-2:hover {
        color: green;
    }
    .list-0-2-3 a {
        color: #000;
        font-size: 16px;
    }

相对于CSSModules的好处:因为样式是写在JS中的,我们就可以基于一些逻辑操作,实现样式的动态化管理!!
*/
const useStyles = createUseStyles({
    box: {
        backgroundColor: 'lightblue',
        width: '300px'
    },
    title: {
        fontSize: '20px',
        color: 'red',
        '&:hover': {
            color: props => props.color
        }
    },
    list: props => {
        return {
            '& a': {
                fontSize: props.size + 'px',
                color: '#000'
            }
        };
    }
});

const Nav = function Nav() {
    let { box, title, list } = useStyles({
        size: 14,
        color: 'orange'
    });
    return <nav className={box}>
        <h2 className={title}>购物商城</h2>
        <div className={list}>
            <a href="">首页</a>
            <a href="">秒杀</a>
            <a href="">我的</a>
        </div>
    </nav>;
};

export default Nav;

createUseStyles返回的是hooks函数,只能用于函数组件,对于类组件,要做处理

React - 18 React样式私有化处理_react_19

import React from "react";
import { createUseStyles } from 'react-jss';
const useStyles = createUseStyles({
    box: {
        backgroundColor: 'lightpink',
        width: '400px'
    },
    list: {
        '& li': {
            lineHeight: '30px',
            '&:hover': {
                color: 'red'
            }
        }
    }
});

class Menu extends React.Component {
    render() {
        let { box, list } = this.props;
        return <div className={box}>
            <ul className={list}>
                <li>手机</li>
                <li>电脑</li>
                <li>家电</li>
            </ul>
        </div>;
    }
};

// 创建一个代理组件(函数组件):获取基于ReactJSS编写的样式,把获取的样式基于属性传递给类组件
const ProxyComponent = function ProxyComponent(Component) {
    // Component:真实要渲染的组件「例如 Menu」
    // 方法执行要返回的一个函数组件:我们基于export default导出的是这个组件,在App调用的也是这个组件(HOC)
    return function HOC(props) {
        let sty = useStyles();
        return <Component {...props} {...sty} />;
    };
};

export default ProxyComponent(Menu);

----------引出---------

5.react 高阶组件HOC

利用js中的闭包[柯里化函数]实现的组件代理

React - 18 React样式私有化处理_react_20

高阶组件,在b包中可以做一些操作

React - 18 React样式私有化处理_react_21

6.styled-components插件

React - 18 React样式私有化处理_react_22

编写公共样式

React - 18 React样式私有化处理_react_23

使用公共样式

React - 18 React样式私有化处理_react_24

React - 18 React样式私有化处理_react_25

传递属性、设置默认值

React - 18 React样式私有化处理_react_26

直接在jsx组件中编写样式

React - 18 React样式私有化处理_react_27

React - 18 React样式私有化处理_react_28

React - 18 React样式私有化处理_react_29

React - 18 React样式私有化处理_react_30


好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

客服QQ 1913284695