美文网首页
React之样式的几种写法和注意的问题

React之样式的几种写法和注意的问题

作者: 甘道夫老矣 | 来源:发表于2019-06-19 17:54 被阅读0次

    一.标签样式

        render(){
            const {data}=this.state;
            return (
                <div >
                    <h1 style={{textAlign:"center",fontFamily:"黑体"}}></h1>
                </div>
            )
        }
    
    

    二.内部声明样式

    const shape={
        border:"1px solid black",
        width:200,
        margin:"auto"
    }
    class AntdUi extends Component {
        render(){
            const {data}=this.state;
            return (
                <div >
                    <h1 style={shape}></h1>
                </div>
            )
        }
    }
    

    三.外部引用(常用)

    一般我们会根据业务逻辑来现实某些样式,vue可以直接通过:bind来直接写判断,但是react的样式是对象的形式,所以稍微麻烦点,并且需要配置cssModel
    这里需要注意一个问题,vue写样式有个scoped,但是react没有,需要配置的

    //home.less
    .main{
         border:"1px solid black"
    }
    //组件
    import  style from './home.less';
    import  './home.less';//不配置cssModel
    class AntdUi extends Component {
        render(){
            const {data}=this.state;
            return (
                <div >
                    <h1 className={style.main}></h1>
                    //如果有base样式
                    <h1 className={`${style.main} left`}></h1>
                    //如果需要判断的样式
                    <h1 className={
                       this.state.clickbtn===item.path?
                        `${style.btn_click}  ${style.nav_btnclick}`:` ${style.nav_btnclick}`
                      }
                    ></h1>
                  //如果需要多重判断的样式
                   <div className="rt">
                    {item.YJZT==='1'?<div className={style.ok}>健康</div>: (
                      item.YJZT==='2'?<div className={style.qdyj}>轻度</div>: (
                        item.YJZT==='3'?<div className={style.zdyj}>中度</div>:(
                          item.YJZT==='4'?<div className={style.zzdyj}>重度</div>:"")
                      )
                    )}
                </div>
                <div className="main">不配置cssModel</div>
                </div>
            )
        }
    }
    

    注意:之前写这里忘了个问题,补充一下,我也是在自己打建项目写样式的时候才发现的,使用对象模式的样式配置的问题,下面附图
    比如我们需要用到less,但是我下的脚手架没有配置less的配置,所以配置下

      webpack.config.js文件
      //最重要的一点
      // ***** 这个就说加载module的.less格式==style.xxx这种形式,想要用局部的样式,
      //那么命文件名字就xx.module.less格式,你也可以改下正则
                const lessModuleRegex = /\.module\.less$/;
                                            
           //如果需要使用less,你必须按照sass的配置来写less的配置,大概在410行左右
               {
                  test:lessRegex ,
                  exclude: lessModuleRegex,
                  use: getStyleLoaders(
                    {
                      importLoaders: 2,
                      sourceMap: isEnvProduction && shouldUseSourceMap,
                    },
                    'less-loader'
                    ).concat({
                      loader:"sass-resources-loader",
                      options:{
                        resources:path.resolve(__dirname,"./../src/component/css/base.less")
                      }
                    }),
                    sideEffects: true,
                    //modules: true, 核心的,用style的模式,编译出来是乱码的class
                   // use: getStyleLoaders({ importLoaders: 2 ,}, 'less-loader'),
                },
                {
                  test: lessModuleRegex,
                  use: getStyleLoaders(
                    {
                      importLoaders: 2,
                     // sourceMap: isEnvProduction && shouldUseSourceMap,
                      modules: true,
                      getLocalIdent: getCSSModuleLocalIdent,
                    },
                    'less-loader'
                  ),
             },
      
                /*
                  解释下上面的这段代码是干嘛的,这是配置一个全局的公用样式,就是我们所说的base样式,
                  需要下在这个:sass-resources-loader,这个技能解析less,又能解析sass
                  .concat({
                      loader:"sass-resources-loader",
                      options:{
                        resources:path.resolve(__dirname,"./../src/component/css/base.less")
                      }
                    }
    */
    
    
    

    配置完后效果是这样的


    12.png

    四.如何在react中获取dom

    一般有些情况我们不得已需要操作dom,你可document来获取,但是不一定会成功,因为有时候会因为子组件render顺序,导致你获取不到这个dom,vue里面有ref一样的意思,但是用法稍微有点不一样,多console.log几次就知道了

      componentDidMount() {
        const {divH}=this.state;
        /*
          如果你运用在多组件嵌套的情况下,并且你不是很会优化,
          由于 this.list 属性获取的是真实 DOM ,
          所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错或者取到空对象
        */
        if( this.refs.list){
           this.list.style.height=divH;
        }
        if(this.refs.list){
           this.refs.list.style.height=divH;
        } 
      }
       return (
                <div>
                    <div
                     ref={(val) =>{
                        if(val){
                          //console.log(val),就是当前的这个dom
                          this.list=val
                        }}
                     } 
                    >写法1</div>   
                   <div  ref="list">写法二</div>   
                </div>
      )
    

    相关文章

      网友评论

          本文标题:React之样式的几种写法和注意的问题

          本文链接:https://www.haomeiwen.com/subject/smnkqctx.html