开门见山
首先入口组件App
:
没什么东西就是一些布局(antd的组件),然后我自己加了3个Link
用于点击测试,一个自定义的DDD
组件
function App({children}) {
return (
<Layout>
<Header>Header</Header>
<Layout>
<Sider style={{height:500}}>Sider</Sider>
<Content style={{height:500}}>
<h3>
<Link to="/"> 首页</Link>
<Link to="/aaa"> AAA</Link>
<Link to="/bbb"> BBB</Link>
</h3>
<DDD>
{children}
</DDD>
</Content>
</Layout>
<Footer>Footer</Footer>
</Layout>
)
}
export default withRouter(connect()(IndexPage))
DDD组件:
function DDD(props) {
return (
<div>
{props.children}
</div>
);
}
export default connect()(DDD);
router.js
return (
<HashRouter>
<App>
<Switch>
<Route path="/aaa" component={AAA} />
<Route path="/bbb" component={BBB} />
</Switch>
</App>
</HashRouter>
);
主要上面这3个文件,上面这个情况下发现一个问题:
》》》点击App
组件里Link
,并不会展示对应的路由页面
刚开始觉得嘛是自定义的DDD
组件用了connect
,导致路由更新被阻碍了,确实,我给DDD组件的connect
外面套了个withRouter
,可以了
但是关键不在这!
我发现我不给DDD
组件加withRouter
,而是在App组件的{children}
随便加点什么,再去点击Link
就可以渲染对应的路由组件了
即:
function App({children}) {
return (
<Layout>
<Header>Header</Header>
<Layout>
<Sider style={{height:500}}>Sider</Sider>
<Content style={{height:500}}>
<h3>
<Link to="/"> 首页</Link>
<Link to="/aaa"> AAA</Link>
<Link to="/bbb"> BBB</Link>
</h3>
<DDD>
1111111
{children}
</DDD>
</Content>
</Layout>
<Footer>Footer</Footer>
</Layout>
)
}
export default withRouter(connect()(IndexPage))
??????????????
完全无法理解了,google了很多,文档也看了,一天下来还是无法想通,好难受,憋得慌,求大佬给个真相!
主要搞后端的,闲着就自学了Vue,从上个星期开始学React的,希望大佬可以稍微说的详细些,谢谢大家^_^
大兄弟, 你很幸运, 我每天就上来回答一两道题, 今天刚好挑到了你的.
这种写法不跟新的原因是因为, DDD 组件的
children
属性一直都等于children
对象. connect 后的 DDD 组件 shouldComponentUpdate 会因为 props 没有变化而返回 false, 阻止了组件更新.这种写法呢, 你传递给 DDD 的 children 属性就是一个数组了
[111, children]
. 这种情况下 DDD 的 children 属性永远不会相同, 因为每次都会生成一个新数组, 导致每次 DDD 每次接收到的 props 都相同, 所以可以正常更新.