dvajs / dva

🌱 React and redux based, lightweight and elm-style framework. (Inspired by elm and choo)
https://dvajs.com/
MIT License
16.25k stars 3.16k forks source link

如何使用 getProvider 方法中的`extraProps` ? #1843

Closed givingwu closed 5 years ago

givingwu commented 6 years ago
  1. Question Does extraProps work? And how to use it?
function getProvider(store, app, router) {
  const DvaRoot = extraProps => (
    <Provider store={store}>
      { router({ app, history: app._history, ...extraProps }) }
    </Provider>
  );
  return DvaRoot;
}
  1. Why 你在代码里声明了它,但是它并没有起任何作用。 这个功能存在一个场景是这样的,我想添加额外的属性,但是不想挂载到 dva 实例上,而后在app._router使用:
    
    // 5. Start with extra props
    app.start('#root', {
    routes,
    menus,
    });

// use in RouterConfig export default function RouterContainer ({ app, history, menus, routes, redirect }) { // ... }

否则的话我得这样使用
```javascript
app.otherProps = {
  routes,
  menus,
};
app.start('#root')

// use in RouterConfig
export default function RouterContainer ({ app, history }) {
  // 挺丑陋的写法
  const { menus, routes, redirect } = app.otherProps; 
  // ...
}

如果你非常忙的话,我可以提一个PR。且这个不会影响任何已有功能。

  1. start 方法入口加入一个参数

    function start(container, extraProps) {
    // ....
    if (container) {
      render(container, store, app, app._router, extraProps);
    
      app._plugin.apply('onHmr')(render.bind(null, container, store, app));
    } else {
      return getProvider(store, this, this._router, extraProps);
    }
    }
  2. render 方法中加入这个参数

    function render(container, store, app, router, extraProps) {
    var ReactDOM = require('react-dom'); // eslint-disable-line
    
    ReactDOM.render(_react.default.createElement(getProvider(store, app, router, extraProps)), container);
    }
  3. 修改 getProvider 方法中加入该参数

    function getProvider(store, app, router, extraProps) {
    var DvaRoot = function DvaRoot() {
    return _react.default.createElement(_reactRedux.Provider, {
      store: store
    }, router((0, _objectSpread2.default)({
      app: app,
      history: app._history
    }, extraProps)));
    };
    
    return DvaRoot;
    }
  4. end

当然,你可能有更好的解决方法,或者我一开始就理解错了。你在某个地方留了这个入口,不过我没有翻到/读到。

谢谢。

stale[bot] commented 5 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.