【问题标题】:Write logic code inside tag [duplicate]在标签内编写逻辑代码[重复]
【发布时间】:2023-03-20 19:07:01
【问题描述】:

我想在 Step 标签内有一个 switch case 语句,以根据步骤号获取正确格式的消息,但它总是在那里提示错误。

错误提示:

[ts] 预期表达式

export const MainBoxHeader = props => (
  <Row style={{ marginBottom: 12 }} gutter={100}>
    <Col span={8}>
      <BackButton
        style={{ visibility: props.backButtonIsHidden ? 'hidden' : 'visible' }}
        onClick={props.onClickBack}
      >
        <FormattedMessage id="back" />
      </BackButton>
    </Col>
    <Col span={8}>
      <Step>
        <FormattedMessage id={`SE-196.PopUp${(props.step)}.Step`} />
      </Step>
    </Col>
    <Col span={8}>
      <ColorBtn color="purple" onClick={props.onClickNext}>
        <FormattedMessage id="continue" />
      </ColorBtn>
    </Col>
  </Row>
);

【问题讨论】:

  • 请详细说明您的问题。你想做什么?错误是什么?这个开关需要在Step 组件内还是MainBoxHeader 组件内?
  • 嗨@DominikJanković,我更新了图片,我想很容易理解我需要什么。
  • 请不要只提供代码图片,如果相关,请在答案中发布实际代码以及图片
  • 为什么有图片而不是纯文本?这是代码。
  • 已更新。这是代码。

标签: reactjs typescript


【解决方案1】:

把逻辑放到返回的JSX外面,把结果存到一个局部变量里,然后嵌入到返回的JSX中。

var stepNode = null; // some sensible default in case of unexpected input; depends on what you want to happen in your situation.

if (props.step == 1) {
    stepNode = <Something ...>
} else if (props.step == 2) {
    stepNode = <Something-Else ....>
}
return (<TheJSX>
            ....
                <Div> { stepNode } </Div>
            .....
       </TheJSX>);

编辑:

关于默认值,您必须考虑如果输入与您期望的不匹配会发生什么,例如比如props.step 设置为 4。

我相信 React 只是忽略了 null 值,但我可能弄错了。根据您的情况,您可能希望记录错误或显示完全不同的内容。

【讨论】:

  • null 的使用是没有意义的,它会阻止类型系统在这种情况下提供明确的赋值错误,因为变量总是有一个值。这并没有真正回答问题,而且格式不正确
  • null 并非毫无意义,因为他的 switch 语句只涵盖值 1 和 2;如果props.step 的值为 34 会怎样?
  • 最好不要指定初始值并明确处理缺席。具体来说,我反对的是使用初始赋值会阻止编译器进行明确的赋值分析。 let stepNode 是正确的
  • 编译器会告诉你不是所有的路径都分配一个值,所以当你看到意外的输入时,你应该通过分配一些默认的合理值来修复它。
  • 接受的答案,例如,调用一个函数,但在出现意外值的情况下,该函数只会返回undefined。怎么样更好?
【解决方案2】:

试试下面的语法

<Step>
    {(() => {
        switch(...) {}
    })()}
</Step>

这里需要返回值。

你可以使用

renderSwitch(param) {
  switch(param) {
    case 'foo':
      return 'bar';
    default:
      return 'foo';
  }
}

render() {
  return (
    <Step>
      {this.renderSwitch(param)}
     </Step> 
  );
}

在这里你可以使用一个函数,你可以在其中编写 switch case 并在你的渲染语句中使用它

【讨论】:

  • 这是正确的,但您应该解释的是,案例也需要使用return而不是break
  • @AluanHaddad 你现在可以检查我的答案吗
  • 谢谢,但是当我得到 props.step 时它显示未定义,如何将其转换为数字?
  • 你能安慰你的流行音乐吗?
  • 它给了我“PopUpundefined.Step”
【解决方案3】:

Sangram 的灵魂可以工作,但您可以使用模板文字并完全取消开关。或者将开关提取到一个函数中并在您的函数组件中引用它 - 恕我直言,这两种解决方案都会更干净。

例如:

export const MainBoxHeader = props => (
  // ...
  <Step>
    <FormattedMessage id={`PopUp${props.step}.Step`} />
  </Step>
  // ...
)

或者

const getFormattedMessage = step => (
  switch (step) {
    case 1:
      return <FormattedMessage ... />
  }
)

export const MainBoxHeader = props => (
  // ...
  <Step>
    {getFormattedMessage(props.step)}
  </Step>
  // ...
)

或者考虑一下该逻辑是否更适合 step 组件本身,您可以在其中向 Step 传递一个诸如 &lt;Step stepId={props.step} /&gt; 之类的道具,并在 Step 本身内部处理渲染逻辑。当然,您可能有充分的理由不这样做,并且可以改用上述任何解决方案。

希望我能帮上忙。

【讨论】:

  • 谢谢,但是当我得到 props.step 时它显示未定义,如何将其转换为数字?
  • 您是否将step 属性传递给MainBoxHeader
  • 是的,我通过的步长等于 1。
  • 使用呈现MainBoxHeader 的组件更新您的问题,这样我们就可以确切地看到发生了什么。如果您正确传递了所有内容,则不应在功能组件的 props 中未定义 step
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 2011-08-30
  • 2013-11-10
  • 1970-01-01
  • 2017-05-15
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多