2017-08-08 5 views
3

私の質問は、JSX &の条件付きレンダリングについて、thisの使用です。それはコンポーネントが呼ばれると<li>タグを表示しますごと時間は適用されませんように私は条件付きでonMouseEnter属性をレンダリングしたいJSXレンダリングされたhtml要素で "this"を使用できないのはなぜですか?

render() { 
    return (
     <li onMouseEnter={this.mouseEnter}> 
      //things 
     </li> 
    ) 
    } 

は自分のアプリケーションを反応させるのに次のコードを考えてみましょう。例えば

render() { 
    return (
     <li {this.renderMouseEvents()} > 
      ... 
     </li> 
    ) 
    } 

しかし、Visual Studioは不平を言うと明らかにHTML要素の外側{ this.renderMouseEvents() }を呼び出す

thisの使用を受け入れる "[JS]" ... "期待" と述べています。

thisがJSXのhtml要素内で無効なのはなぜですか?

JSXでこの条件付きレンダリングを行うには、適切で清潔な方法はありますか?

すべてのヘルプは高く評価され、感謝!

+2

mouseEnter関数に条件を追加するだけではどうですか? – Nevosis

+3

この質問は[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)を提示します。あなたのJSXスニペットは構文的に無効ですが、 'this'の使用法はそれとはあまり関係ありません。 – noppa

答えて

1

何が書かれていることは、有効なJSXの構文ではありません。代わりに次を試してください。

mouseEnterBehaviorEnabled()は、trueまたはfalseを返す関数です。ここでは、mouseEnterをトリガーするときのロジックを設定します。

MDNのShort circuit evaluationをご覧ください。あなたはもちろん、単に

render() { 
    return (
    <li onMouseEnter={this.mouseEnter} > 
     ... 
    </li> 
); 
} 

を行うと、元の動作の残りの部分の前にmouseEnter内のロジックを実行することができ

render() { 
    return (
    <li onMouseEnter={this.mouseEnterBehaviorEnabled() && this.mouseEnter} > 
     ... 
    </li> 
); 
} 

。これらの条件が満たされない場合は、falseを返し、残りは実行されません。

+0

その式が偽と評価されるとどうなりますか? 'onMouseEnter'属性は単に反応によって省略されるか、' onMouseEnter = {} 'としてレンダリングされますか? – lsimonetti

+0

私は伝統的なインラインHTMLイベントハンドラと構文を混同していると思います。あなたのコードを調べると 'onMouseEnter'という属性はなく、レンダリングされません。しかし、長い話は短いです。 'mouseEnterBehaviorEnabled()'が 'false'であるため、' this.mouseEnterBehaviorEnabled()&& this.mouseEnter'もfalseで、 'onMouseEnter'もfalseであることを意味します。何も起こりません。 – Chris

+1

意味があります。フィードバック/情報ありがとう! – lsimonetti

0

JSXでthisを使用できますが、これは問題ではないと思います。

thisは問題がある場合、それは、あなたの方法renderMouseEvents内側にあることがありますが、それはthisbindたのですか?

しかし、あなたの方法renderMouseEventsが返ってきているので、それは動作しないと思います。しかし、役立つこと、これをチェックアウト、プロパティを注入することが可能である:

Dynamic attribute in ReactJS

+0

いいえ、彼はJSをjsx htmlのようなタグに挿入することはできません – Nevosis

+1

私が投稿したリンクで、それはうまくいくようです: 'return ; ' ボタンはHTMLタグであり、メソッドによって返される可能性のあるいくつかの小道具を受け取りますか?私は前にそれをやったし、それは魅力のように動作します。 – sjahan

2

属性だけにあなたの条件を挿入します。

import noop from 'lodash/noop'; 

render() { 
    return (
     <li onMouseEnter={ifSatisfies ? this.mouseEnter : noop}> 
      //things 
     </li> 
    ) 
    } 
1

あなたはスプレッド演算子(ES6)を使用して、論理AND短絡評価によってそれを行うことができます。

...{ onClick: condition && this.handleClick } 

例:

const arr = ["1", "2", "3"]; 
 

 
class App extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    } 
 

 
    handleClick = e => { 
 
    console.log(e.target.innerHTML); 
 
    }; 
 

 
    render() { 
 
    return (
 
     <div> 
 
     {arr.map(o => { 
 
      const myProps = { 
 
      ...{ onClick: o != "1" && this.handleClick } 
 
      }; 
 
      return (
 
      <li {...myProps}> 
 
       {o} 
 
      </li> 
 
     ); 
 
     })} 
 
     </div> 
 
    ); 
 
    } 
 
} 
 

 
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="root"></div>

0

もし私があなたが尋ねていることを理解している、私はあなたが走っている問題はJSX JavaScriptに変換します。

React.createElement('li', { { onMouseEnter: this.mouseEnter } }, '...'); 

この:何が書かれていることはおそらくあなたのrenderMouseEvents()戻り{ onMouseEnter: this.mouseEnter }を想定し、このように翻訳しようとする

React.createElement('el', { arg1: '1', arg2: '2' }, '3'); 

<el arg1="1" arg2="2">3</el> 

は、次のようなものに変換されますJavaScriptが無効です。コンパイラは...(JavaScriptの普及構文)を予期していますが、この問題を解決する可能性があります。

noppaが述べたように、あなたが望むものを達成するためのより良い方法があるかもしれません。あなたは直面している問題についてより具体的になることができますか?

関連する問題