zoukankan      html  css  js  c++  java
  • React中设置样式

    使用一个小例子来演示React中样式的使用,如下图,做一个静态的评论列表组件:

     1.创建两个JSX文件:CmtItem.jsx和CmtList.jsx

    CmtList.jsx:

    import React from 'react';
    //导入评论项子组件
    import CmtItem from '@/components/CmtItem'
    
    //使用class关键字定义父组件
    export default class CmtList extends React.Component{
        constructor(){
           super();
           this.state = {
              //这是评论列表数据
              CommentList: [
                 {id: 1, user: "张三", content: "哈哈,沙发" },
                 {id: 2, user: "李四", content: "哈哈,板凳" },
                 {id: 3, user: "王五", content: "哈哈,凉席" },
                 {id: 4, user: "赵六", content: "哈哈,砖头" },
                 {id: 5, user: "田七", content: "哈哈,热炕头" }
              ]
           }
        }
     
        render(){
           return <div>
              <h1>这是评论列表组件</h1>
              {this.state.CommentList.map(item => {
                 return <CmtItem {...item} key={item.id}></CmtItem>
              })}
              </div>
        }
     }

    CmtItem.jsx:

    import React from 'react';
    
    //使用function构造函数定义普通的无状态组件
    export default function CmtItem(props){
        return <div>
                 <h1>评论人:{props.user}</h1>
                 <p>评论内容:{props.content}</p>
               </div> 
     }

    index.js:

    // 1.导入包
    import React from 'react'
    import ReactDOM from 'react-dom'
    
    //导入评论项子组件
    import CmtList from '@/components/CmtList'
    
    ReactDOM.render(<div>
       <CmtList></CmtList>
       </div>,document.getElementById('app'));

    主要的框架已经搭建好了,如下图:

     2.现在要给该列表组件添加样式:

    (1)使用普通的style样式,类似以下这种(注意与HTML标签使用样式的区别):

    <h1 style = { { color: 'red', fontWeight: 200 } } ></h1>

    下面是HTML标签的语法,注意区别:

    <h1 style = " color: red; font-weight: 200 " ></h1>

    (2)将样式对象和UI结构分离,例如:

    //第一层封装方式:将样式对象和UI结构分离
    const itemStyle = {border: '1px dashed #ccc', margin: '10px', padding: '10px', boxShadow: '0 0 #ccc'};
    
    const userStyle = {fontSize: '14px'};
    
    const contentStyle = {fontSize: '12px'};
    
    //使用function构造函数定义普通的无状态组件
    export default function CmtItem(props){
        return <div style = {itemStyle}>
                 <h1 style = {userStyle}>评论人:{props.user}</h1>
                 <p style = {contentStyle}>评论内容:{props.content}</p>
               </div> 
     }

    (3)合并成一个大的样式对象,例如:

    //第二种封装方式:合并成一个大的样式对象
    const styles = {
        item: {border: '1px dashed #ccc', margin: '10px', padding: '10px', boxShadow: '0 0 #ccc'},
        user: {fontSize: '14px'},
        content: {fontSize: '12px'}
    }
    
    //使用function构造函数定义普通的无状态组件
    export default function CmtItem(props){
        return <div style = {styles.item}>
                 <h1 style = {styles.user}>评论人:{props.user}</h1>
                 <p style = {styles.content}>评论内容:{props.content}</p>
                 </div> 
     }

    (4)抽离为单独的样式模块:创建一个style.js文件:

    export default{
        item: {border: '1px dashed #ccc', margin: '10px', padding: '10px', boxShadow: '0 0 10px #ccc'},
        user: {fontSize: '14px'},
        content: {fontSize: '12px'}
    }

    然后再调用该文件(例如,CmtItem.jsx:):

    //第三种封装方式:抽离为单独的样式模块
    import styles from '@/components/styles.js'
    
    //使用function构造函数定义普通的无状态组件
    export default function CmtItem(props){
        return <div style = {styles.item}>
                 <h1 style = {styles.user}>评论人:{props.user}</h1>
                 <p style = {styles.content}>评论内容:{props.content}</p>
                 </div> 
     }

    (5)创建样式表文件:cmtlist.css文件,首先需要安装style-loader和css-loader并启用css-modules:

      ●修改webpack.config.js配置文件,为css-loader添加参数

      ●在需要的组件中,import导入样式表,并接收模块化的CSS样式对象

      ●在需要的HTML标签上,使用className指定模块化的CSS样式对象

    module: {   //所有第三方模块的配置规则
            rules: [ 
                {test: /.js|jsx$/, use:'babel-loader', exclude: /node_modules/},  //注意:在配置babel-loader时,一定要加上exclude: /node_modules/,否则整个项目会报错
                //可以在css-loader之后通过?追加参数
                //其中有个固定的参数modules,表示为普通的CSS样式表启用模块化
               {test: /.css$/, use: ['style-loader', 'css-loader?modules']},   //打包处理css样式表的第三方loader          
            ]
        }

    样式表cmtlist.css:

    .title{
        color: red;
        font-size: 35px;
        font-weight: 200;
        text-align: center;
    }
    /*css模块化只针对 类选择器(例如.title) 和 ID选择器(例如#id)生效,不会将标签选择器模块化*/
    .user{
        font-size: 14px;
    }
    
    .content{
        font-size: 12px;
    }
    
    .cmtbox{
        border: 1px dashed #ccc; 
        margin: 10px; 
        padding: 10px;
        box-shadow: 0 0 10px #ccc;
    }
    
    /* 被 :global 包裹起来的类名不会被css-modules模块化,而是会全局生效
       被 :local 包裹起来的类名会被模块化,默认情况下所有的类名和ID都是被模块化的 */
    :global(.test){
        font-style: italic;
    }

    调用样式表,例如,CmtItem.jsx::

    import React from 'react';
    import cssobj from '@/css/cmtlist.scss'
    console.log(cssobj);   //如果没有启用css-modules模块化,则cssobj只是一个空对象,下面的引用样式的方式应该是className="样式名"
    
    //使用function构造函数定义普通的无状态组件
    export default function CmtItem(props){
        return <div className={cssobj.cmtbox}>
                 <h1 className={cssobj.user}>评论人:{props.user}</h1>
                 <p className={cssobj.content}>评论内容:{props.content}</p>
                 </div> 
     }

    css模块化后控制台输出的cssobj对象的内容如下:类名的值是随机码,如果想要自定义生成类名格式,可以使用localIdentName

     使用localIdentName自定义生成类名格式,可选的参数有:

      ●[path] 表示样式表相对于项目根目录所在的路径

      ●[name] 表示样式表文件名称

      ●[local] 表示样式的类名定义名称

      ●[hash:length] 表示32位的hash值

    //css配置如下
    {test: /.css$/, use: [
                    {
                        loader: 'style-loader'
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            modules: {
                                localIdentName: "[path][name]-[local]-[hash:5]"
                            }
                         }
                    },
                    {
                        loader: 'sass-loader'
                    }  
                ]}   //打包处理scss文件的loader

  • 相关阅读:
    常见的概念
    cas底层
    判断页面是否读取了缓存
    window.location.hash(hash应用)---跳转到hash值制定的具体页面
    * 输入框被第三方输入法遮挡问题
    Mui去掉滚动条:
    实用网址
    完美解决safari、微信浏览器下拉回弹效果。
    移动端兼容性问题解决方案
    监听ios自带返回功能
  • 原文地址:https://www.cnblogs.com/zcy9838/p/12023168.html
Copyright © 2011-2022 走看看