【问题标题】:How to declare const that contains JSX inside a condition and access it outside the condition? [duplicate]如何在条件内声明包含 JSX 的 const 并在条件外访问它? [复制]
【发布时间】:2020-03-02 17:07:07
【问题描述】:

如果(且仅当)一些在 props 中传递时,我应该渲染图片的组件有问题。

我在条件中声明了一个const UserImagesJsx,但我无法在返回的表达式中访问它,它告诉我它是未定义的。

代码如下:

import React from 'react';
import styled from 'styled-components'

import FlickityComponent from 'react-flickity-component'
import 'flickity/css/flickity.css'

const ImagesContainer = styled.div`
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
`

const flickityOptions = {...}

function UserImages(props) {

    const userPictures = props.images;

    if (userPictures) {
        const UserImagesArray = () => {
            return (
                userPictures.map((text, index) => 
                    <img id={`profile-image-${index}`} src={text.url} alt={text.name} key={text.name} />
                    // onClick={() => openModal(text._id)}
            ));
        }

        const UserImagesJsx = () => {
            return (
                <ImagesContainer>
                    <FlickityComponent className={'carousel'} elementType={'div'} options={flickityOptions}>
                        <UserImagesArray/>
                    </FlickityComponent>
                </ImagesContainer>
            );
        }
    }

    return (
        <ImagesContainer>
            { userPictures && <UserImagesJsx/> }
        </ImagesContainer>
    );  
}

export default UserImages;

【问题讨论】:

标签: javascript reactjs scope


【解决方案1】:

正如 TKoL 所说,const 是块作用域,因此如果不满足条件,您的变量将不会被声明。你也可以试试这个:

 function UserImages(props) {

      const userPictures = props.images;

      if (userPictures) {
        const UserImagesArray = () => {
          return (
            userPictures.map((text, index) =>
              <img id={`profile-image-${index}`} src={text.url} alt={text.name} key={text.name} />
              // onClick={() => openModal(text._id)}
            ));
        }

        const UserImagesJsx = () => {
          return (
            <ImagesContainer>
              <FlickityComponent className={'carousel'} elementType={'div'} options={flickityOptions}>
                <UserImagesArray />
              </FlickityComponent>
            </ImagesContainer>
          );
        }

        return (
          <ImagesContainer>
            {userPictures && <UserImagesJsx />}
          </ImagesContainer>
        );

      } else {

        return null;

      }


    }

【讨论】:

    【解决方案2】:

    const 是块作用域——尝试在 if 语句之前声明它。

    let UserImagesJsx;
    if (userPictures) {
      ...
      UserImagesJsx = () => ...
    }
    

    【讨论】:

    • Uncaught SyntaxError: Missing initializer in const declaration,你不能声明一个没有值的const,你以后也不能重新分配它,这就是JS中const的全部意义。
    • 啊当然,let 这样更好
    • 在这种情况下,这并不重要,因为在渲染内部定义组件无论如何都是一种反模式。
    • 感谢您抽出宝贵时间回复。我以为只有 let 是块范围。如果我声明一个 const 并为其分配一个值,我以后就不能在我的条件下更改它。如果我没有给它赋值 intellisense 告诉我这一行有一个解析错误
    • 使用let 而不是const 看看它是否有效。你甚至可以这样声明:let UserImagesJsx = () =&gt; null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多