gpt4 book ai didi

jquery-ui - 如何在 React JS 中使用 jQuery UI

转载 作者:行者123 更新时间:2023-12-03 12:56:51 25 4
gpt4 key购买 nike

如何在 React 中使用 jQuery UI?我看过谷歌搜索的几个例子,但它们似乎都已经过时了。

最佳答案

如果你真的需要这样做,这是我正在使用的一种方法。

方案:创建一个组件来管理 jQuery 插件 .该组件将提供一个以 React 为中心的 jQuery 组件 View 。此外,它将:

  • 使用 React 生命周期方法初始化和拆除 jQuery 插件;
  • 使用 React props作为插件配置选项并连接到插件的方法事件;
  • 在组件卸载时销毁插件。

  • 让我们探索一个实际示例,如何使用 jQuery UI Sortable 做到这一点。插入。

    TLDR:最终版本

    如果您只想获取包装好的 jQuery UI Sortable 示例的最终版本:
  • 这是一个 GIST I made带有完整的注释评论;
  • 这是一个 jsfiddle DEMO ,也有完整的注释评论;

  • ...另外,以下是较长注释代码片段的缩短:
    class Sortable extends React.Component {
    componentDidMount() {
    this.$node = $(this.refs.sortable);
    this.$node.sortable({
    opacity: this.props.opacity,
    change: (event, ui) => this.props.onChange(event, ui)
    });
    }

    shouldComponentUpdate() { return false; }

    componentWillReceiveProps(nextProps) {
    if (nextProps.enable !== this.props.enable)
    this.$node.sortable(nextProps.enable ? 'enable' : 'disable');
    }

    renderItems() {
    return this.props.data.map( (item, i) =>
    <li key={i} className="ui-state-default">
    <span className="ui-icon ui-icon-arrowthick-2-n-s"></span>
    { item }
    </li>
    );
    }
    render() {
    return (
    <ul ref="sortable">
    { this.renderItems() }
    </ul>
    );
    }

    componentWillUnmount() {
    this.$node.sortable('destroy');
    }
    };

    或者,您可以设置默认 Prop (在没有传递的情况下)和 Prop 类型:
    Sortable.defaultProps = {
    opacity: 1,
    enable: true
    };

    Sortable.propTypes = {
    opacity: React.PropTypes.number,
    enable: React.PropTypes.bool,
    onChange: React.PropTypes.func.isRequired
    };

    ...这里是如何使用 <Sortable />成分:
    class MyComponent extends React.Component {
    constructor(props) {
    super(props);
    // Use this flag to disable/enable the <Sortable />
    this.state = { isEnabled: true };

    this.toggleEnableability = this.toggleEnableability.bind(this);
    }

    toggleEnableability() {
    this.setState({ isEnabled: ! this.state.isEnabled });
    }

    handleOnChange(event, ui) {
    console.log('DOM changed!', event, ui);
    }

    render() {
    const list = ['ReactJS', 'JSX', 'JavaScript', 'jQuery', 'jQuery UI'];

    return (
    <div>
    <button type="button"
    onClick={this.toggleEnableability}>
    Toggle enable/disable
    </button>
    <Sortable
    opacity={0.8}
    data={list}
    enable={this.state.isEnabled}
    onChange={this.handleOnChange} />
    </div>
    );
    }
    }

    ReactDOM.render(<MyComponent />, document.getElementById('app'));

    完整的解释

    对于那些想了解的人 为什么怎么样 .这是一个分步指南:

    第 1 步:创建一个组件。

    我们的组件将接受项目(字符串)的数组(列表)作为 data支柱。
    class Sortable extends React.Component {
    componentDidMount() {
    // Every React component has a function that exposes the
    // underlying DOM node that it is wrapping. We can use that
    // DOM node, pass it to jQuery and initialize the plugin.

    // You'll find that many jQuery plugins follow this same pattern
    // and you'll be able to pass the component DOM node to jQuery
    // and call the plugin function.

    // Get the DOM node and store the jQuery element reference
    this.$node = $(this.refs.sortable);

    // Initialize the jQuery UI functionality you need
    // in this case, the Sortable: https://jqueryui.com/sortable/
    this.$node.sortable();
    }

    // jQuery UI sortable expects a <ul> list with <li>s.
    renderItems() {
    return this.props.data.map( (item, i) =>
    <li key={i} className="ui-state-default">
    <span className="ui-icon ui-icon-arrowthick-2-n-s"></span>
    { item }
    </li>
    );
    }
    render() {
    return (
    <ul ref="sortable">
    { this.renderItems() }
    </ul>
    );
    }
    };

    第 2 步:通过 props 传递配置选项

    假设我们要配置 the opacity of the helper while sorting .我们将使用 opacity插件配置中的选项,它采用来自 0.01 的值至 1 .
    class Sortable extends React.Component {
    // ... omitted for brevity

    componentDidMount() {
    this.$node = $(this.refs.sortable);

    this.$node.sortable({
    // Get the incoming `opacity` prop and use it in the plugin configuration
    opacity: this.props.opacity,
    });
    }

    // ... omitted for brevity
    };

    // Optional: set the default props, in case none are passed
    Sortable.defaultProps = {
    opacity: 1
    };

    下面是我们现在如何在我们的代码中使用该组件:
    <Sortable opacity={0.8} />

    同样的方式,我们可以映射任何 jQUery UI Sortable options .

    第 3 步:插件事件的连接函数。

    您很可能需要连接一些插件方法,以执行一些 React 逻辑,例如,操作状态 let's day。

    以下是如何做到这一点:
    class Sortable extends React.Component {
    // ... omitted for brevity

    componentDidMount() {
    this.$node = $(this.refs.sortable);

    this.$node.sortable({
    opacity: this.props.opacity,
    // Get the incoming onChange function
    // and invoke it on the Sortable `change` event
    change: (event, ui) => this.props.onChange(event, ui)
    });
    }

    // ... omitted for brevity
    };

    // Optional: set the prop types
    Sortable.propTypes = {
    onChange: React.PropTypes.func.isRequired
    };

    以下是如何使用它:
    <Sortable
    opacity={0.8}
    onChange={ (event, ui) => console.log('DOM changed!', event, ui) } />

    第 4 步:将 future 更新控制传递给 jQuery

    在 ReactJS 在实际 DOM 中添加元素之后,我们需要将 future 控制权传递给 jQuery。否则,ReactJS 永远不会重新渲染我们的组件,但我们不希望那样。我们希望 jQuery 负责所有更新。

    React 生命周期方法来拯救你了!

    使用 shouldComponentUpdate() 让 React 知道组件的输出是否不受当前 state 或 props 变化的影响。默认行为是在每次状态更改时重新渲染,并且在绝大多数情况下,但我们不希望这种行为!
    shouldComponentUpdate()当接收到新的 props 或 state 时,在渲染之前调用。如 shouldComponentUpdate()返回 false ,然后 componentWillUpdate() , render() , 和 componentDidUpdate()不会被调用。

    然后,我们使用 componentWillReceiveProps() ,我们比较 this.propsnextProps并仅在必要时调用 jQuery UI 可排序更新。对于这个例子,我们将实现 jQuery UI Sortable 的启用/禁用选项。
    class Sortable extends React.Component {
    // Force a single-render of the component,
    // by returning false from shouldComponentUpdate ReactJS lifecycle hook.
    // Right after ReactJS adds the element in the actual DOM,
    // we need to pass the future control to jQuery.
    // This way, ReactJS will never re-render our component,
    // and jQuery will be responsible for all updates.
    shouldComponentUpdate() {
    return false;
    }

    componentWillReceiveProps(nextProps) {
    // Each time when component receives new props,
    // we should trigger refresh or perform anything else we need.
    // For this example, we'll update only the enable/disable option,
    // as soon as we receive a different value for this.props.enable
    if (nextProps.enable !== this.props.enable) {
    this.$node.sortable(nextProps.enable ? 'enable' : 'disable');
    }
    }

    // ... omitted for brevity
    };

    // Optional: set the default props, in case none are passed
    Sortable.defaultProps = {
    enable: true
    };

    // Optional: set the prop types
    Sortable.propTypes = {
    enable: React.PropTypes.bool
    };

    第五步:清理杂物。

    许多 jQuery 插件提供了一种在不再需要时自行清理的机制。 jQuery UI Sortable 提供了一个事件,我们可以触发它来告诉插件解除其 DOM 事件的绑定(bind)并销毁。 React 生命周期方法再次派上用场,并提供了一种在组件卸载时 Hook 的机制。
    class Sortable extends React.Component {
    // ... omitted for brevity

    componentWillUnmount() {
    // Clean up the mess when the component unmounts
    this.$node.sortable('destroy');
    }

    // ... omitted for brevity
    };

    结论

    用 React 包装 jQuery 插件并不总是最好的选择。但是,很高兴知道这是一个选项以及如何实现解决方案。如果您要将旧的 jQuery 应用程序迁移到 React,或者您可能只是找不到适合您的需求的 React 插件,那么这是一个可行的选择。

    在库修改 DOM 的情况下,我们尽量让 React 不受干扰 .当 React 完全控制 DOM 时,它的效果最好。在这些情况下,React 组件更像是 3rd 方库的包装器。主要是通过使用 componentDidMount/componentWillUnmount 来初始化/销毁第三方库。和 Prop 作为一种方式,让父级自定义子级包装的第三方库的行为并连接插件事件。

    您可以使用这种方法集成几乎所有 jQuery 插件 !

    关于jquery-ui - 如何在 React JS 中使用 jQuery UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38836553/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com