首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在useEffect中使用componentDidUpdate代码以及DidMount和UnMount

在useEffect中使用componentDidUpdate代码以及DidMount和UnMount
EN

Stack Overflow用户
提问于 2019-01-20 15:34:15
回答 1查看 1.5K关注 0票数 3

我正在尝试将我的代码迁移到支持react钩子的新react。我使用的是useReducer、useState和useEffect。我可以在代码中使用DidMountUnMount,但不知道如何实现DidUpdate部件,因为这可能会造成重新呈现问题。

我是这样做的:

旧代码

代码语言:javascript
复制
class ImageBoard extends React.Component {
    constructor() {
      super();
      this.state = {
        canvas: undefined,
        selected: undefined
      };
    }

    handleDeleteKey(event) {
      if (event.keyCode === 46 || event.keyCode === 8) {
        event.preventDefault();
        if (this.state.selected !== undefined) {
          this.state.canvas.remove(this.state.selected);
          this.setState({ selected: undefined });
        }
      }
    }

    componentDidMount() {
      const canvas = new fabric.Canvas("canvas");
      document.addEventListener("keydown",this.handleDeleteKey.bind(this),false);
      canvas.on("object:selected", e => this.setState({ selected: e.target }));
      canvas.on("selection:cleared", e => this.setState({ selected: undefined }));
      this.setState({ canvas: canvas });
      this.setCanvasBackground(this.props.getSelectedImage, canvas);
    }

    componentDidUpdate(prevProps) {
      if (prevProps.getSelectedImage !== this.props.getSelectedImage) {
        this.setCanvasBackground(this.props.getSelectedImage,this.state.canvas);
      }

    }

更改为以下新代码

代码语言:javascript
复制
const ImageBoard = () => {
  let canvasEl = React.useRef(null);
  const [selected, setSelected] = React.useState(null)
  const [canvas, setCanvas] = React.useState(null)
 const [state, _] = React.useReducer(imagesReducer, [])

  const handleDeleteKey = event => {
    if (event.keyCode === 46 || event.keyCode === 8) {
      event.preventDefault();
      if (selected !== undefined) {
        canvas.remove(selected);
        setSelected(undefined);
      }
    }
  }

  React.useEffect(() => {
    const canvas = new fabric.Canvas("canvas");
    document.addEventListener(
      "keydown",
      handleDeleteKey,
      false
    );
    canvas.on("object:selected", e => setSelected(e.target));
    canvas.on("selection:cleared", e => setSelected(undefined));
    setCanvas(canvas);
    setCanvasBackground(state.images.selectedImage, canvas);
    return () => {
      document.removeEventListener("keydown", handleDeleteKey, false);
    }
  }, [])

如何用useEffect编写下面的代码片段?

代码语言:javascript
复制
componentDidUpdate(prevProps) {
          if (prevProps.getSelectedImage !== this.props.getSelectedImage) {
            this.setCanvasBackground(this.props.getSelectedImage,this.state.canvas);
          }
          this.setCanvasBackground(this.props.getSelectedImage,this.state.canvas);
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-20 18:28:43

如果意图是在收到相同的道具时避免不必要的更新,并且这适用于所有道具,而不仅仅是getSelectedImage,那么组件可以成为纯组件:

代码语言:javascript
复制
const ImageBoard = memo(props => { ... });

因此,只有在接收到新的属性时,组件才会被重新呈现,包括useEffect

代码语言:javascript
复制
  useEffect(() => {
    // runs every time the component is rendered
    setCanvasBackground(props.getSelectedImage, canvas);
  })

如果组件的一部分应该仅在接收到特定属性(如getSelectedImage )的新值时才进行评估,则根据具体情况使用useMemouseEffect挂钩来完成此操作。由于useEffect既可以充当componentDidUpdate,也可以充当componentDidMount,因此应该考虑这一点。

代码语言:javascript
复制
  useEffect(() => {
    // runs once on mount
    const canvas = new fabric.Canvas("canvas");
    document.addEventListener(
      "keydown",
      handleDeleteKey,
      false
    );
    canvas.on("object:selected", e => setSelected(e.target));
    canvas.on("selection:cleared", e => setSelected(undefined));
    setCanvas(canvas);
    // setCanvasBackground is moved to another hook
    return () => {
      document.removeEventListener("keydown", handleDeleteKey, false);
    }
  }, [])

  useEffect(() => {
    // runs every time new getSelectedImage is received, including initial render
    setCanvasBackground(props.getSelectedImage, canvas);
  }, [props.getSelectedImage])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54274443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档