您是否可以在使用Preactjs时直接操作DOM?

问题描述 投票:1回答:1

我正在为下一个项目研究Preact。

由于它没有虚拟DOM,所以我想知道它是否像React一样,希望您让框架操纵DOM而不是自己直接操纵DOM。

Preact凹凸头是否可以与另一个操纵DOM的库(例如SVGjs)一起使用?

dom dom-manipulation preact
1个回答
1
投票
在进行DOM更新时,

Preact是non-destructiveofficial guide已经解释了如何将外部DOM操作集成到preact组件中:

如果使用基于类的组件:

import { h, Component } from 'preact';

class Example extends Component {

  shouldComponentUpdate() {
    // IMPORTANT: do not re-render via diff:
    return false;
  }

  componentWillReceiveProps(nextProps) {
    // you can do something with incoming props here if you need
  }

  componentDidMount() {
    // now mounted, can freely modify the DOM:
    const thing = document.createElement('maybe-a-custom-element');
    this.base.appendChild(thing);
  }

  componentWillUnmount() {
    // component is about to be removed from the DOM, perform any cleanup.
  }

  render() {
    return <div class="example" />;
  }
}

如果使用钩子,则使用memo中的preact/compat功能:

import { h } from 'preact';
import { useEffect } from 'preact/hooks';
import { memo } from 'preact/compat';

function Example(props) {

  const [node, setNode] = setState(null);

  useEffect(() => {
    const elm = document.createElement('maybe-a-custom-element');

    setNode(elm);

    // Now do anything with the elm.
    // Append to body or <div class="example"></div>

  }, []);

  return <div class="example" />;
}

// Usage with default comparison function
const Memoed = memo(Example);

// Usage with custom comparison function
const Memoed2 = memo(Example, (prevProps, nextProps) => {
  // Only re-render when `name' changes
  return prevProps.name === nextProps.name;
});

[另外,请注意,Preact的render()函数总是在容器内部比较DOM子级。因此,如果您的容器包含非Preact呈现的DOM,则Preact会尝试将其与您传递的元素进行比较。 -因此含义non-destructive

© www.soinside.com 2019 - 2024. All rights reserved.