理由はわかりませんが、if/else
ステートメントで変数を宣言すると、let
またはconst
変数を呼び出せないようです。
if (withBorder) {
const classes = `${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
} else {
const classes = `${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
}
return (
<div className={classes}>
{renderedResult}
</div>
);
このコードを使用すると、classes is not defined
と表示されます。
しかし、const
をvar
クラスに変更しても、classes used outside of binding context
およびall var declarations must be at the top of the function scope
についての警告が表示される場合
どうすれば修正できますか?
三項割り当てを使用する必要があります。
const classes = withBorder ?
`${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center` :
`${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`
他のコメント/回答で指定されているように、let
とconst
はスコープがブロックされているため、この例では機能しません。
DRYerコードの場合、文字列リテラル内に3項をネストすることもできます。
const classes = `${withBorder ? styles.dimensions: ''} ${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`
let
とconst
はブロックレベルのスコープです。つまり、ieで定義されたブロック内でのみ使用できます。 { // if defined in here can only be used here }
この場合、if/elseステートメントの上に定義するだけです
let classes;
if (withBorder) {
classes = `${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
} else {
classes = `${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
}
別の方法(goodまたはelegantでもわかりません):
const classes = (() => {
if (withBorder) {
return `${styles.circularBorder}...`;
} else {
return `${styles.dimensions}...`;
}
})();
if
-_else
- statementではなく、3項式を使用しないでください。
const classes = withBorder
? `${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`
: `${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
または、if
ブロックの外側で宣言するだけで、重複を取り除くこともできます。
let classes = `${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
if (withBorder) {
classes += ` ${styles.circularBorder}`;
// or if you care about the order,
// classes = `${styles.circularBorder} ${classes}`;
}
乱雑なクラス名の構築 もご覧ください。
let
とconst
はブロックレベルのスコープであるため、ブロックの外部で定義する必要があります。 var
は動作するため動作します。
@ finalfreq のようなclasses
ブロックの前にif
を定義できます
または
let classes = `${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`;
if (withBorder) {
classes += `${styles.circularBorder}`;
}
ESLint標準では、行頭の演算子が好きです。コンピュータのタイムループにない限り、長い条件文も抽象化する必要があります。
この特定のケースでは、文字列も長いので、それらも抽象化します。ベルギのやり方の問題は、ほとんどのリンターが適合性の理由で彼のスタイルを損なうことです。
この方法により、3進法に慣れている場合は、すべてを正常に読みやすくすることができます。
const styleWithBorder = `${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`
const styleWithoutBorder = `${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`
const classes = isBorderedElement ? [ styleWithBorder ] : [ styleWithoutBorder ]
シンプル、これを行うだけです:
const genericStyle = `${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`,
classes = withBorder ? `${styles.circularBorder} ${genericStyle}` : genericStyle;
return (
<div className={classes}>
{renderedResult}
</div>
);
これにはいくつかのクリーンアップもあり、クラスは2回使用され、circularBorder
のみが違います...