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属性中


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

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






3.CSSModules



公共样式

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

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

4.react-jss插件



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函数,只能用于函数组件,对于类组件,要做处理

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中的闭包[柯里化函数]实现的组件代理

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

6.styled-components插件

编写公共样式

使用公共样式


传递属性、设置默认值

直接在jsx组件中编写样式




好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论
您可能感兴趣的博客
