Javascript
template-literals

[js] tagged template literals

Template literals

// styled-component
const Button = styled.button`
  display: inline-block;
  color: white;
`;

``叫做 Template literals。

Template literals 其中一個進階形式叫做 Tagged templates (opens in a new tab) ,他會把除了變數以外的字串拆出來放進 Array(有點像是.split(變數)?),並且可以用直接放在 function 後面免括號當成變數送進去。

先看看:

const name = "chun";
const age = 30;
 
console.log`My name is ${name}, I am ${age} years old.`;
// -> ['My name is ', ', I am ', ' years old.'] 'chun' 30

可以看到第一個產出的是 string array,然後依序是${}內的元素,當這樣給 function 時,就能以這樣的順序當作變數處理。

const name = "chun";
const age = 30;
 
const tag = (...args) => {
  console.log(args);
};
 
tag`My name is ${name}, I am ${age} years old.`;
// -> [Array(3), 'chun', 30]
// Array(3) 的內容就是 ['My name is ', ', I am ', ' years old.']

而 styled.button 這樣的形式,從原始碼可以看見 styled.button 其實就是 styled['button'],也能查看完整的 domElement (opens in a new tab) 有哪些。

// source code
export default (styledComponent: Function, constructWithOptions: Function) => {
  const styled = (tag: Target) => constructWithOptions(styledComponent, tag);
 
  // Shorthands for all valid HTML Elements
  domElements.forEach((domElement) => {
    styled[domElement] = styled(domElement);
  });
 
  return styled;
};

透過這樣的語法結構,styled 成為一個製造 component 的工廠,收入我們丟進去的 CSS 內容(包含 props),經過處理後回傳給你結果的 styled-component。