React jsx 中寫更優雅、直觀的條件運算符

這篇文字中我學到了不少知識,同時結合工做中的一些經驗也在思考一些東西。好比條件運算符javascript

Conditional Operator

condition ? expr_if_true : expr_if_falsejava

jsx中書寫條件語句咱們常常都會使用到的就是三目運算符(?:)也叫內聯條件運算符,可能你們都有體會三目運算符並非一種直觀的書寫方式。特別是在複雜狀況下時。react

拿上面文章中的代碼舉個git

return (
  <div>
    <p>Text: {this.state.text}</p>
    {
      view
      ? null
      : (
        <p>
          <input
            onChange={this.handleChange}
            value={this.state.inputText} />
        </p>
      )
    }
  </div>
);

上面的代碼是根據view變量爲false時顯示一個p元素github

或者是下面這樣顯示不一樣的元素或組件post

return (
  <div>
    <p>Text: {this.state.text}</p>
    {
      view
      ? (
        <p>
          something value
        </p>
      ) : (
        <p>
          <input
            onChange={this.handleChange}
            value={this.state.inputText} />
        </p>
      )
    }
  </div>
);

過多的javascript三目運算符在jsx中看起來並不那麼容易,邏輯區分有時也會變的複雜this

若是你又一些嵌套,狀況會更復雜(大部分eslint並不能使用嵌套)eslint

return (
  <div>
    { condition1
      ? <Component1 />
      : ( condition2
        ? <Component2 />
        : ( condition3
          ? <Component3 />
          : <Component 4 />
        )
      )
    }
  </div>
);

上面的代碼我也遇到過,維護起來就像在沼澤裏行走code

我嘗試着思考,可否將這種條件運算符進行更高級別的抽象,而後使用React組件實現它們呢?component

通過嘗試確實是可行的,因而我作了一些東西。抽象後jsx條件運算就像下面這樣

根據某個變量的值顯示某個組件

<If when={this.state.logic}>
  <p>↔️show component</p>
</If>

同上,可是具備更高的可讀性,並且邏輯和美觀程度上優越於三目運算符

<If when={this.state.logic}>
  <p>↔️show component</p>
  <If when={this.state.logic}>
    <p>other component</p>
  </If>
</If>

還有更多的選擇,我應該不用作過多解釋就能看明白下面的代碼了

<Switch value={value}>
  <Case when={condition}>
    <p>condition 1</p>
  </Case>
  <Case when={condition}>
    <p>condition 2</p>
  </Case>
  <Case when='c' children={<p>condition 3</p>}/>
  <Default children={<p>default component</p>}/> {/*可提供一個默認組件*/}
</Switch>

遍歷一個arrayobject

<For of={['a', 'b', 'c']}>
  {(item, index) => (<p key={index}>{index}:{item}</p>)}
  <Default>default component</Default> {/*可提供一個默認組件*/}
</For>

我建立這個倉庫供你們嘗試

你又任何想法?歡迎討論。

感謝閱讀

相關文章
相關標籤/搜索