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

时间:2017-10-05 12:55:29

标签: 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>
        );
    }
}

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

先谢谢你们。

5 个答案:

答案 0 :(得分:20)

  

也许我倾向于使用ComponentWillMount或ComponentDidMount

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

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>
    );
  }
}

答案 1 :(得分:13)

在遇到相同问题后,只需在此处发布最新更新,即可使用功能组件和useEffect / useState React 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>
  );
}

答案 2 :(得分:2)

如果你使用 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>
      );
    }

答案 3 :(得分:0)

<img />

此处有更多信息Get viewport/window height in ReactJS

答案 4 :(得分:0)

const MyFunction = () => {

  const [width, setWidth] = React.useState(window.innerWidth);
  const breakPoint = 1450;

 

  useEffect(() => {
   const handleWindowResize = () => setWidth(window.innerWidth);
   window.addEventListener("resize", handleWindowResize);

    
   return () => window.removeEventListener("resize", handleWindowResize);
  },[]);

  return (
    <div>
      {width > breakPoint? (
        <div>I show on 1451px or higher</div>
      ) : (
        <div>I show on 1450px or lower</div>
      )}
    </div>
  );
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>