根据视口大小有条件地进行渲染

LOT*_*SMS 13 reactjs

对你来说这应该是一个简单的反应怪物.:)我已经写了条件,但我无法弄清楚如何在我的构造函数中处理视口大小以使条件工作.简单明了,我希望在视口大小为1451px或更宽时显示一个元素,在1450px或更小时显示另一个元素.

这是我的代码(简化)

class My Class extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            isDesktop: "1450px" //This is where I am having problems
        };
    }

    render() {
        const isDesktop = this.state.isDesktop;

        return (
            <div>
                {isDesktop ? (
                    <div>I show on 1451px or higher</div>
                ) : (
                    <div>I show on 1450px or lower</div>
                )}
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

也许我倾向于使用ComponentWillMount或ComponentDidMount来处理它.老实说,不确定.我是React的新手.

先谢谢你们.

小智 28

也许我倾向于使用ComponentWillMount或ComponentDidMount来处理它

是的,您需要监听resize事件并更新内部状态.您可以通过在组件安装时添加事件处理程序来完成此操作.试试这里的完整示例.

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isDesktop: false //This is where I am having problems
    };

    this.updatePredicate = this.updatePredicate.bind(this);
  }
  componentDidMount() {
    this.updatePredicate();
    window.addEventListener("resize", this.updatePredicate);
  }

  componentWillUnmount() {
    window.removeEventListener("resize", this.updatePredicate);
  }

  updatePredicate() {
    this.setState({ isDesktop: window.innerWidth > 1450 });
  }

  render() {
    const isDesktop = this.state.isDesktop;

    return (
      <div>
        {isDesktop ? (
          <div>I show on 1451px or higher</div>
        ) : (
          <div>I show on 1450px or lower</div>
        )}
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


foa*_*esm 22

只是在我遇到同样的问题后在这里发布最近的更新,但使用功能组件和useEffect/ useStateReact Hooks 进行设置:

const MyFunction = () => {
  const [isDesktop, setDesktop] = useState(window.innerWidth > 1450);

  const updateMedia = () => {
    setDesktop(window.innerWidth > 1450);
  };

  useEffect(() => {
    window.addEventListener("resize", updateMedia);
    return () => window.removeEventListener("resize", updateMedia);
  });

  return (
    <div>
      {isDesktop ? (
        <div>I show on 1451px or higher</div>
      ) : (
        <div>I show on 1450px or lower</div>
      )}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 就像字面上复制粘贴和编辑一样,这有效,yasssssss!谢谢你!@foakesm (4认同)

syl*_*n s 13

如果你使用NextJS ...你会遇到类似这样的错误:window is not Defined。这是代码,没有错误,请享受。

首先我检查窗口的大小是否大于或小于1450px(因为如果用户从不调整窗口大小,所有代码将毫无用处)

但我还需要检查用户是否调整窗口大小......自己看看

    export default function MyFunction() {
        const [isDesktop, setDesktop] = useState(false);

  useEffect(() => {
    if (window.innerWidth > 1450) {
      setDesktop(true);
    } else {
      setDesktop(false);
    }

    const updateMedia = () => {
      if (window.innerWidth > 1450) {
        setDesktop(true);
      } else {
        setDesktop(false);
      }
    };
    window.addEventListener('resize', updateMedia);
    return () => window.removeEventListener('resize', updateMedia);
  }, []);
    
      return (
          <div>
              {isDesktop ? (
                  <div>I show on 1451px or higher</div>
              ) : (
                  <div>I show on 1450px or lower</div>
              )}
          </div>
      );
    }
Run Code Online (Sandbox Code Playgroud)