reactjs – 限制Redux仅更新受更改影响的组件

前端之家收集整理的这篇文章主要介绍了reactjs – 限制Redux仅更新受更改影响的组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
试图了解React-Redux,我觉得不寻常的是,当状态的任何一部分发生变化时,我的所有组件都会获得新的道具.这是设计还是我做错了?

示例App

  1. class App extends React.Component {
  2.  
  3. render(){return (
  4. <div>
  5. <Navbar data={this.props.navbar} />
  6. <Content data={this.props.content} />
  7. </div>);
  8. }
  9.  
  10. }
  11. select (state) => ({ navbar:state.navbar,content:state.content});
  12. export default connect(select)(App);

组件

  1. export const NavbarForm = props => {
  2. console.log('RENDERING with props--->',props);
  3. return (<h1>NAV {props.data.val}</h1>);
  4. };
  5. export const ContentForm = props => {
  6. console.log('RENDERING CONTENT with props--->',props);
  7. return (<h1>CONTENT {props.data.val}</h1>);
  8. };
  9.  
  10. ////////INDEX.js//////
  11.  
  12. const placeholderReducer = (state={val:0},action)=>{
  13. //will update val to current time if action start with test/;
  14. if(action.type.indexOf('TEST/') === 0)return {val:Date.now();}
  15.  
  16. return state;
  17. }
  18.  
  19. export const rootReducer = combineReducers({
  20. navbar:placeholderReducer,content: (state,action)=>(state || {}),//**this will never do a thing.. so content should never updates right !!**
  21. });
  22.  
  23. const store = createStore(rootReducer,{},applyMiddleware(thunk));
  24.  
  25. render( <Provider store={store}> <App /></Provider>,document.getElementById('app')
  26. );
  27. setInterval(()=>{ store.dispatch(()=>{type:'TEST/BOOM'}) },3000);

好吧,在这个应用程序中,我期望Navbar组件将每3000毫秒更新一次,而内容组件永远不会更新,因为它的reducer将始终返回相同的状态.

但是我发现每次触发动作时两个组件都会执行reRender非常奇怪.

这是设计的吗?如果我的应用程序有100个组件,我应该担心性能吗?

这完全是设计上的. React假定您的整个应用程序默认情况下将从上到下重新呈现,或者如果某个组件执行setState或类似操作,则至少会重新呈现给定的子树.

因为您只连接了应用程序中的顶级组件,所以从那里开始的所有内容都是React的标准行为.父组件重新呈现,导致其所有子项重新呈现,依此类推.

在React中提高UI性能的核心方法是使用shouldComponentUpdate生命周期方法来检查传入的props,如果组件不需要重新渲染,则返回false.这将导致React跳过重新呈现该组件及其所有后代. shouldComponentUpdate中的比较通常使用浅引用相等来完成,这是“相同的对象引用意味着不更新”的东西变得有用.

使用Redux和连接时,您几乎总会发现自己在UI中的许多不同组件上使用connect.这提供了许多好处.组件可以单独提取他们需要的存储状态的各个部分,而不必将它们全部从根组件中移除.此外,connect为您实现了一个默认的shouldComponentUpdate,并对您从mapStateToProps函数返回的值进行了类似的检查.因此,从某种意义上说,在多个组件上使用连接往往会让您在性能方面获得“自由获胜”.

进一步阅读该主题

> Redux FAQ: Connecting multiple components
> React/Redux Links: Performance articles

猜你在找的React相关文章