useSubEnv 本质
owl专题


很多术语从表面上看起来非常深奥, 解释起来可能也会非常麻烦,但往往从代码上可以很简单的洞悉其本质。 先看这个函数的实现

    function useSubEnv(nextEnv) {
        const component = Component.current;
        component.env = Object.assign(Object.create(component.env), nextEnv);
    }

看得出来,本质就是对component的env进行了扩展。 而文档上面讲这个会传播到component的子组件, 那我再看看compoent的构造函数

     */
        constructor(parent, props) {
            Component.current = this;
            let constr = this.constructor;
            const defaultProps = constr.defaultProps;
            if (defaultProps) {
                props = props || {};
                this.__applyDefaultProps(props, defaultProps);
            }
            this.props = props;
            if (QWeb.dev) {
                QWeb.utils.validateProps(constr, this.props);
            }
            const id = nextId++;
            let depth;
            if (parent) {
                this.env = parent.env;
                const __powl__ = parent.__owl__;
                __powl__.children[id] = this;
                depth = __powl__.depth + 1;
            }

代码中可以看得出this.env = parent.env; 实际上子组件就是使用了父组件的env,所以,这个env当然会向下传播。

in OWL