React 界面樣式設計

當我們完成程序的基本功能後,不對程序界面進行打磨妝點,那麼過於素顏的界面,對用戶是產生不了吸引力的。對於網頁應用而言,用來美化界面的技術,一直都是CSS,CSS是一種好技術,它能將界面的美化和程序的功能邏輯進行良好的分離。特別是它的選擇子功能,能夠讓開發者針對某個具體控件進行美化。

然而在React 框架下,我們不好繼續使用CSS來設計界面,這是由 React的設計思想所決定的。React的核新思想是,讓每一個控件 成爲高度可重用的獨立個體,這就要求控件的界面設計邏輯和它的 功能邏輯必須整合到一起,

在原有邏輯下,控件的功能邏輯由js編寫,控件的呈現界面由css負責,兩者是分離的。那麼React 是怎麼把他們結合在一起,同時, 又能保證邏輯上的耦合度儘量降低的呢。其實React 並不拒絕使用CSS來設計界面,先從我們熟悉 的css開始,慢慢過渡到React 的界面設計方式上來。

首先在目錄下新建一個空白文件叫style.html,然後我們先完成程序的基本框架代碼

1,先使用css來設計界面元素

<!DOCTYPE  html>
<html>
    <head>
         <title>Styling in  React</title>
         <script src="react.js"></script>
         <script src="react-dom.js"></script>
         <script src="browser.min.js"></script>
         <style type="text/css">
            #container {
                 padding: 50px;
                 background-color: #FFF;
            }
         </style>
         <body>
             <div id="container"></div>
         </body>
    </head>
</html>

接下來我們先在界面上顯示一些信息:

<script type="text/babel">
    var Letter  =   React.createClass({
         render:function()  {
             return (
                 <div>
                    {this.props.children}
                 </div>
                 );
         }
    });
    var destination = document.querySelector("#container");
    ReactDOM.render(
         <div>
            <Letter>T</Letter>
            <Letter>Y</Letter>
            <Letter>L</Letter>
            <Letter>E</Letter>
            <Letter>R</Letter>
         </div>,
         destination)
</script>

在代碼中,我們先創建一個Letter組件,在組件中,我們直接使用了它的一個屬性叫children, 在下面的代碼中,我們使用Letter 組件時,在它的標籤中夾着一個字母,分別是T,Y,L,E,R.夾在組件標籤中的元素,就對應於該組件的孩子,也就是this.props.children.

使⽤css來對我們在界面上顯示的幾個字母進行妝點。

div div div {
     padding: 10px;
     margin: 10px;
     background-color: #ffde00;
     display:   inline-block;
     color: #333;
     display:   inline-block;
     font-family:   monospace;
     font-size: 32px;
     text-align:    center;
}

可以看到,這種做法,當我們的界面組合間套層次很深時,就很容易出錯了,而且代碼邏輯很難維護。 一個好的做法是,通過類名來確定選擇子,代碼如下

.letter {
     padding:   10px;
     margin:    10px;
     background-color:  #ffde00;
     display:   inline-block;
     color: #333;
     display:   inline-block;
     font-family:   monospace;
     font-size: 32px;
     text-align:    center;
}
var Letter  =   React.createClass({
     render:function()  {
         return (
             <div className="letter">
                {this.props.children}
             </div>
            );
    }
});

接下來我們看看,如何 以react的方式來修飾界面

按照React的組件化原則,控件的 界面邏輯和業務邏輯,需要放在在一起。這樣,原來用css設計元素界面的辦法就不適用了。React 的做法是,把界面的設計邏輯 做成一個對象,放在組件內部,代碼如下:

var Letter  =   React.createClass({
     render:function() {
         var letterStyle = {
             padding:10,
             margin:10,
             backgroundColor:"#ffde00",
             color: "#333",
             display: "inline-block",
             fontFamily: "monospace",
             fontSize: 32,
             textAlign: "center"
         };
         return (
             <div style={letterStyle}>
                {this.props.children}
             </div>
            );
     }
});

把原來的css代碼邏輯轉變成了一個json格式的js對象。 在組件的jsx代碼中,使用style關鍵字,把界面設計邏輯所 形成的對象,引入進來。在組件中設置界面邏輯時,需要注意以下幾點: 1是,在指定數值大小時,可以忽略掉px後綴。例如在指定 padding, margin, fontSize 這些屬性的值時,數值後面無需 添加後綴。也就是原來在css中,需要以px結尾的數值,在React 組件中,px都可以去掉。但其他數值,如果不是以px結尾的,那麼相關後綴仍然需要保留。

接下來,我們讓組件樣式設計更靈活一些,我們看看如何實現組件 背景顏色的參數化。

當前我們字母背景色是寫死成黃色的,如果該背景色能隨時變化, 那感覺就相當酷了。使用組件的屬性機制,我們的代碼修改如下:

var Letter  =   React.createClass({
     render:function()  {
         var letterStyle    =   {
                padding:   10,
                margin: 10,
                backgroundColor:this.props.bgcolor
                color:  "#333",
                display:    "inline-block",
                fontFamily: "monospace",
                fontSize:   32,
                textAlign:  "center"
            };
        return (
             <div style={letterStyle}>
                {this.props.children}
             </div>
             );
     }
});
var destination =   document.querySelector("#container");
ReactDOM.render(
     <div>
        <Letter bgcolor="#58B3FF">T</Letter>
        <Letter bgcolor="#FF605F">Y</Letter>
        <Letter bgcolor="#FFD52E">L</Letter>
        <Letter bgcolor="#49DD8E">E</Letter>
        <Letter bgcolor="#AE99FF">R</Letter>
     </div>,
     destination
 );

結論:

傳統的開發方法是把業務邏輯,界面設計分別分佈在html, js, 和css中,這種做法在開發簡單網頁應用時是可以的。但當我們 需要開發複雜的可重用組件時,原有方法就不適合了,因爲原來 的做法把業務邏輯和界面設計分隔開,而組件化設計需要把所有 相關邏輯都得整合在一起。

當今趨勢是,網頁應用越來越複雜,功能也越來越強大,依賴 React的設計開發方法將是未來網頁應用開發的主流。原有業務 邏輯與界面設計邏輯相互分開的做法,與當下網頁應用越來越 複雜,功能也越來越強大的趨勢,應當是不相符合的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章