使用if else声明在if/else之后使用`let`或`const`?

Joh*_*ana 28 javascript if-statement const let reactjs

我不知道为什么,但如果我在声明中声明它们,我似乎无法调用letconst变量if/else.

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>
);
Run Code Online (Sandbox Code Playgroud)

如果我使用这个代码就说明了classes is not defined.

但是,如果我改变constvar类的定义,但我得到一个关于警告classes used outside of binding contextall var declarations must be at the top of the function scope

我怎么能解决这个问题?

fin*_*req 33

let并且const是块级范围,这意味着它们只能在已定义的块中使用,即.{ // 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`;
}
Run Code Online (Sandbox Code Playgroud)

  • 这不能用const来完成,因为const需要初始化值 (7认同)

mai*_*man 33

你应该使用三元分配:

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`
Run Code Online (Sandbox Code Playgroud)

正如其他注释/答案中所指定的那样,let并且const被阻止范围,这就是为什么它们在您的示例中不起作用的原因.

对于DRYer代码,您还可以将三元组嵌套在字符串文字中:

 const classes = `${withBorder ? styles.dimensions: ''} ${styles.circularBorder} ${styles.dimensions} ${styles.circularPadding} row flex-items-xs-middle flex-items-xs-center`
Run Code Online (Sandbox Code Playgroud)


rap*_*2-h 9

备选方案(虽然不确定是否很好,也不优雅):

const classes = (() => {
    if (withBorder) {
      return `${styles.circularBorder}...`;
    } else {
      return `${styles.dimensions}...`;
    }
})();
Run Code Online (Sandbox Code Playgroud)

  • Javascript 开始发挥其全部自由的那一刻。 (3认同)
  • 这肯定胜过嵌套的速记条件。 (3认同)

Ber*_*rgi 5

不要使用if--else语句而是使用三元表达式:

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`;
Run Code Online (Sandbox Code Playgroud)

或者,只需在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}`;
}
Run Code Online (Sandbox Code Playgroud)

也看看凌乱的类名构造