1. 程式人生 > >React:styled-components

React:styled-components

lan ref something 代碼 的人 ${} def reference 都是

``是es6的Template Literals(模版字符串),許多人對這個一知半解,今天在這邊總結下:

`${expression}`(表達式插補)

var x;
var y;
sth.innerHTML = `相對當前盒子坐標:x軸:${x},y軸:${y}`

這樣表示少了很多代碼量並且提高了閱讀性,不然你需要用+““+來拼接字符串,將拼接字符串更簡單的表示出來,再舉栗子

var a = 5;
var b = 10;
console.log("Fifteen is " + (a + b) + " and\nnot " + (2 * a + b) + ".");
// "Fifteen is 15 and
// not 20."

模版表示法(${}裏面是js表達式,所以包括變量等)

var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and\nnot ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."

多行字符串

console.log("string text line 1\nstring text line 2");
// "string text line 1
// string text line 2"

模版字符串表示法

console.log(`string text line 1
string text line 2`);
// "string text line 1
// string text line 2"

只是簡單加了個回車

主要講講styled-components裏面的語法,用過這個框架的人都知道,定義一個包含樣式的h1:styled.h1`font-size:1.5em;.....`,這裏面就涉及到了模版字符串,一開始不知道為什麽這樣寫,以為又是什麽高科技,測試完才發現其實:

styled.h1`

font-size:1.5em;

`

就等於如下

styled.h1("font-size:1.5em;")

為什麽這樣說呢?

我們來看一個測試:

現在控制臺定義一個函數:

//在瀏覽器控制臺輸入
//這個函數的意思就是輸出這個函數的所有參數,js中的rest用法
const f = (...args) => {console.log(...args)}

在控制臺輸入:f(123) 或者 f(‘123‘)都是正確的輸出

在控制臺輸入:f`123${‘abc‘}`

輸出結果:(2) ["123", "", raw: Array(2)] "abc" >>>一個包含"123",""的長度為2的數組,並在後面輸出abc

在控制臺輸入:f`123${‘abc‘}${‘def‘}`

輸出結果:(3) ["123", "", "", raw: Array(3)] "abc" "qwe" >>>一個包含"123","",""的長度為2的數組,並在後面輸出abc,cdf結合兩次輸出結果,可以發現它總是把${}裏面的東西轉換成""和正常的字符串放在一個數組裏面,並在後面單獨輸出每個${}的值

在控制臺輸入:f`1+2=${1+2}${[1,2,3,4]}`

輸出結果:(3) ["1+2=", "", "", raw: Array(3)] 3 (4) [1, 2, 3, 4] 現在足以證明只要被${}括起來都會轉換成""放在一個數組裏面,並且在後面輸入${}裏面的值

我們再來看一個測試:

//在瀏覽器控制臺輸入
//使用rest參數,當你傳入的參數是一個函數的話就執行這個函數,其他類型一概不執行
const testTemplate = (...args) => args.forEach(arg => {
    if (typeof arg === ‘function‘){
        arg();
    }
})

上面定義了一個函數,接下來我們來傳參數並且看結果了來測試模版字符串的精髓所在。

在控制臺輸入:testTemplate(1,2)

輸出結果:undefined >>>意料之中,因為當你傳入的參數是一個函數的話就執行這個函數,其他類型一概不執行。

在控制臺輸入:testTemplate(1,() => {consolo.log(‘執行了‘)})

輸出結果: 執行了 >>>這裏打印出‘執行了’,說明後面的函數被執行到

在控制臺輸入:testTemplate`1,() => {console.log(‘執行了‘)}`

輸出結果: 執行了 >>>跟上面加了括號的結果一樣。

所以styled.h1,styled.div等等其實都是一個函數,它們接受模版字符串這樣的參數,而為了實現根據傳入的props值顯示不同樣式,可以這樣定義:

const MyDiv = styled.div`
    color:${props => props.color};
    font-size:${props => props.bigger ? ‘2em‘ : ‘1em‘}
`

使用時,可以這樣寫:

//bigger={true} 也可以省略{true},直接寫 bigger
<MyDiv color="green" bigger={true}>something in div...</MyDiv>

總結:

styled-components其實就是函數傳遞。

React:styled-components