react.js 中的 setState 与 refs

IT技术 javascript jquery web reactjs
2021-05-15 01:21:15

我在react中创建了选项卡,现在单击我必须更改选项卡的类,选项卡类可能如下:

1:active
2:previousActive
3:alreadySelected

单击选项卡类成为active并检查它是否在使用alreadySelected之前被选中,并且active最后一个活动选项卡中的类被删除,如果没有,alreadySelected则添加alreadySelected

react中一个选项卡的代码:

var TabBody = React.createClass({
    getInitialState: function() {
        return {
            class: 'tabBody tab activeTab'
        }
    },
    render: function() {
        a.tabBody = this;
        return (React.createElement('div', {
            className: this.state.class,
            ref: 'body',
            onClick: handleTabClick
        },
        React.createElement('span', {}, "Body"))
        );
      }
});

为了更改选项卡的类别,我正在通过两种方式进行操作,并想知道哪种方式有效。代码风格一:

 var bodyClass = (a.tabBody.state.class).split(' ');
 var sleeveClass = (a.tabSleeve.state.class).split(' ');
 var neckClass = (a.tabNeck.state.class).split(' ');
 if (data === 'tabBody') {
     bodyClass.push('activeTab');
     var str1 = program.arrayToString(bodyClass);
     Interfaces.tabBody.setState({
         class: str1
     });
 }

代码样式 2

a.tabBody.refs.body.classList.remove('activeTab');
a.tabBody.refs.body.classList.add('tabPreviewComplete');
a.tabSleeve.refs.body.classList.add('activeTab');

哪种风格适合这样做,为什么?

2个回答

react的重点是你不需要/不应该直接更新DOMreact 背后的想法是您渲染 react 组件(虚拟 DOM),并且让 react 确定是否以及如何更新 DOM。

使用 refs 更改类是一种非常危险的策略:您的组件状态不再与实际 DOM 同步,这可能会让您在以后陷入调试噩梦。所以我认为 Code Style 2(即使它有效)违反了 React 原则。使用 refs 的少数例外之一是在挂载后向 DOM 组件添加侦听器。

react方式是将 classNames 置于 state 中。
并做一个setState()更新。
让 react 来更新 DOM,
这很可能比获取 refs 和更改 className 更快、更干净、更容易维护。

ref 意味着您正在使用实际的 DOM,而 setState 意味着您要做出react,请更新组件的特定属性。每件事都是通过react来维持的。

另一方面,如果您使用 refs,则意味着您正在做自己的每一件事,并且您的react与您正在更新的属性和属性无关。