国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Css in Js 一次實(shí)踐

calx / 3586人閱讀

摘要:最近需要做一個(gè)表格組件,組件需求指定行列可以跨行跨列行和行之間有分割線(xiàn)最終采用實(shí)現(xiàn)需求。所以考慮采用的形式。關(guān)于相關(guān)的概念介紹可以參考阮一峰老師的文章介紹。然后返回一個(gè)組件,把組件替換原來(lái)的即可。想嘗試的小伙伴現(xiàn)在就可以碼一遍。

最近需要做一個(gè)表格組件,組件需求:

指定行、列

可以跨行、跨列

行和行之間有分割線(xiàn)

最終采用grid實(shí)現(xiàn)需求。實(shí)現(xiàn)的時(shí)候遇到一個(gè)問(wèn)題,如果css和js分開(kāi)寫(xiě),css只能是定值,沒(méi)有靈活性。所以考慮采用css in js的形式。關(guān)于css in js相關(guān)的概念介紹可以參考阮一峰老師的文章:css in js 介紹。

在github上找了一下關(guān)于這方面的組件,發(fā)現(xiàn)styled components 非常不錯(cuò),簡(jiǎn)單易上手,

npm下載:`npm i styled-components -S`

注意:

React < 16 需要下載3.x.x版本的
 

根據(jù)文檔先寫(xiě)一個(gè)簡(jiǎn)單的demo。

可以看到,它的實(shí)現(xiàn)方式并不是傳統(tǒng)的以對(duì)象的形式寫(xiě)樣式,而是將需要添加樣式的元素加到styled對(duì)象上,然后跟一個(gè)(``)反引號(hào)標(biāo)簽,在里面以正常的css格式寫(xiě)樣式。然后返回一個(gè)組件,把組件替換原來(lái)的div即可。

實(shí)現(xiàn)效果:

html代碼:

css代碼:

剛才我們添加樣式的元素是html元素,那么給組件添加樣式可以么?實(shí)踐一下:

const H1 = ({ className }) => 

我是App

; const HH = styled.H1` font-size: 30px; color: red; `;

運(yùn)行,報(bào)錯(cuò):

咋回事?原來(lái)styled不支持以 . 符號(hào)的形式為組件添加樣式,需要以參數(shù)形式傳遞,修改上面代碼

const HH = styled(H1)`
  font-size: 30px;
  color: red;
`;

H1組件以參數(shù)形式傳遞給styled,就可以了。

想給元素添加偽元素樣式,子元素樣式可以么?沒(méi)問(wèn)題,styled components支持樣式嵌套,按照類(lèi)似Less或Scss的書(shū)寫(xiě)方式就可以了。

const Container = styled.div`
  width: 300px;
  max-width: 500px;
  min-width: 200px;
  transition: all 1s ease-in-out;
  background-color: rgba(240, 240, 240, 0.9);
  ::after {
    content: "after";
    display: table;
    color: blue;
  }
  span {
    color: green;
  }
`;

以上我們寫(xiě)的組件都是在Class外面,那我們要根據(jù)props設(shè)定樣式怎么辦?styled components同樣支持在Class內(nèi)生成組件,并接受props傳遞過(guò)來(lái)的值,這個(gè)props并不是我們的Class接收的props,它是添加樣式的元素上的Props,意思就是

class Demo {
    
    render(){
        return 
    }
}

Demo.defaultProps = {
    age: 18
}

const Styled = styled.p`
    color: ${props=>{console.log(props)}} // {name: "guoshi",theme:{...}}
`

如果想使用Class的props怎么辦?看代碼:

generateStyle = () => {
        const {row, col, justify, data, prefixCls, showborder = true, rowgap = 0, colgap = 0} = this.props;
        const child = [];
        data.map((item,index)=> (item.colSpan || item.rowSpan) ? child.push({index:index+1,colSpan:item.colSpan, rowSpan:item.rowSpan}):null);
        const bordernone = [];
        for(let i = 0; i < row; i++) {
            bordernone.push(1 + i*col);
        }
        const UlContainer = styled.ul.attrs({className: prefixCls})`
                display: grid;
                grid-template-columns: ${()=> {
                    let arr = [];
                    arr.length = col;
                    return arr.fill("1fr").join(" ");
                }};
                grid-template-rows:  ${()=> {
                    let arr = [];
                    arr.length = row;
                    return arr.fill("1fr").join(" ");
                }};
                grid-gap: ${rowgap} ${colgap} ;
                justify-items: ${()=> justify || "center"};

                ::before {
                    display: none;
                }
                
                li {
                    width: 100% !important;
                }

                ${
                     child.map(({index, colSpan, rowSpan}) =>`
                        li:nth-child(${index}) {
                            grid-column-start: ${index%col === 0 ? index : index%col};
                            grid-column-end: ${colSpan ? (colSpan+(index%col === 0 ? index : index%col)) : ((index%col === 0 ? index : index%col)+1)}
                            grid-row-start: ${Math.ceil(index/col)};
                            grid-row-end: ${rowSpan  ? rowSpan+Math.ceil(index/col) : Math.ceil(index/col)+1};
                            align-items: start;
                        }
                     `).join(" ")
                 }
                
                li + li {
                    border-left: 1px dashed rgba(0,0,0,0.3);
                }

                ${
                    bordernone.map(bordernoneindex=>`
                        li:nth-child(${bordernoneindex}) {
                            border-left: none;
                        }
                    `).join(" ")
                }
                
            `;
        
            return UlContainer;
    }

提前把最后代碼放出來(lái)了,styled.ul.attrs({})就是為元素添加額外的屬性,比如className、placeholder等,從代碼中可以看到,無(wú)論是Class的props還是元素自身傳進(jìn)來(lái)的props,styled都可以接收,你可以自定義任何你想實(shí)現(xiàn)的規(guī)則,更方便我們配置的靈活性。

其實(shí)到這里,使用上沒(méi)有任何問(wèn)題了,關(guān)于keyframes等規(guī)則官網(wǎng)上都有demo,也非常容易實(shí)現(xiàn)。想嘗試的小伙伴現(xiàn)在就可以碼一遍。不過(guò)本章遺留了很多問(wèn)題:

styled.div & styled(div) 有什么區(qū)別

模版字符串中的樣式是怎么解析的?為什么可以嵌套?

為什么會(huì)返回一個(gè)組件?

下一章,我會(huì)根據(jù)styled componnets源碼解答上述問(wèn)題。

最后,祝生活愉快。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/117140.html

相關(guān)文章

  • HTML-CSS-JS

    摘要:本周于上海閉幕,掘金和知乎上都有對(duì)應(yīng)的實(shí)錄和問(wèn)答,但會(huì)議的視頻目前都還沒(méi)放出來(lái),有心的同學(xué)如果找到了歡迎分享。建議中英文對(duì)照閱讀。英文原文前端獨(dú)立技術(shù)博客推薦推薦一些現(xiàn)在還在堅(jiān)持原創(chuàng)的博主,有業(yè)界大牛,也有小鮮肉,也有國(guó)外美女。 CSS 樣式書(shū)寫(xiě)規(guī)范最佳實(shí)踐 本文的所列是實(shí)踐當(dāng)中得出的一套比較不錯(cuò)的 CSS 書(shū)寫(xiě)規(guī)范,可以結(jié)合自身團(tuán)隊(duì)發(fā)展出一套適合自己業(yè)務(wù)的規(guī)范。 CSS中的字體與排版...

    mikasa 評(píng)論0 收藏0
  • HTML-CSS-JS

    摘要:本周于上海閉幕,掘金和知乎上都有對(duì)應(yīng)的實(shí)錄和問(wèn)答,但會(huì)議的視頻目前都還沒(méi)放出來(lái),有心的同學(xué)如果找到了歡迎分享。建議中英文對(duì)照閱讀。英文原文前端獨(dú)立技術(shù)博客推薦推薦一些現(xiàn)在還在堅(jiān)持原創(chuàng)的博主,有業(yè)界大牛,也有小鮮肉,也有國(guó)外美女。 CSS 樣式書(shū)寫(xiě)規(guī)范最佳實(shí)踐 本文的所列是實(shí)踐當(dāng)中得出的一套比較不錯(cuò)的 CSS 書(shū)寫(xiě)規(guī)范,可以結(jié)合自身團(tuán)隊(duì)發(fā)展出一套適合自己業(yè)務(wù)的規(guī)范。 CSS中的字體與排版...

    李世贊 評(píng)論0 收藏0
  • HTML-CSS-JS

    摘要:本周于上海閉幕,掘金和知乎上都有對(duì)應(yīng)的實(shí)錄和問(wèn)答,但會(huì)議的視頻目前都還沒(méi)放出來(lái),有心的同學(xué)如果找到了歡迎分享。建議中英文對(duì)照閱讀。英文原文前端獨(dú)立技術(shù)博客推薦推薦一些現(xiàn)在還在堅(jiān)持原創(chuàng)的博主,有業(yè)界大牛,也有小鮮肉,也有國(guó)外美女。 CSS 樣式書(shū)寫(xiě)規(guī)范最佳實(shí)踐 本文的所列是實(shí)踐當(dāng)中得出的一套比較不錯(cuò)的 CSS 書(shū)寫(xiě)規(guī)范,可以結(jié)合自身團(tuán)隊(duì)發(fā)展出一套適合自己業(yè)務(wù)的規(guī)范。 CSS中的字體與排版...

    MudOnTire 評(píng)論0 收藏0
  • Webpack 最佳實(shí)踐總結(jié)(三)

    摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業(yè)務(wù)邏輯開(kāi)發(fā)流程需要經(jīng)過(guò)預(yù)處理器如或,然后再經(jīng)過(guò)后處理器如進(jìn)行深加工。 還未看的,可以點(diǎn)擊查看上兩篇文章喲:Webpack 最佳實(shí)踐總結(jié)(一)、Webpack 最佳實(shí)踐總結(jié)(二) 好了,這篇是第三篇,也是完結(jié)篇,我感覺(jué)這一篇是最亂的一篇,湊合著看吧,不會(huì)讓你失望的 整合 CSS 加工流 有時(shí)候,前端項(xiàng)目中除了 JavaScript ...

    pkhope 評(píng)論0 收藏0
  • Webpack 最佳實(shí)踐總結(jié)(三)

    摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業(yè)務(wù)邏輯開(kāi)發(fā)流程需要經(jīng)過(guò)預(yù)處理器如或,然后再經(jīng)過(guò)后處理器如進(jìn)行深加工。 還未看的,可以點(diǎn)擊查看上兩篇文章喲:Webpack 最佳實(shí)踐總結(jié)(一)、Webpack 最佳實(shí)踐總結(jié)(二) 好了,這篇是第三篇,也是完結(jié)篇,我感覺(jué)這一篇是最亂的一篇,湊合著看吧,不會(huì)讓你失望的 整合 CSS 加工流 有時(shí)候,前端項(xiàng)目中除了 JavaScript ...

    jerryloveemily 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<