Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 将this.props.prop和nextrops.prop与mobx进行比较_Reactjs_Mobx - Fatal编程技术网

Reactjs 将this.props.prop和nextrops.prop与mobx进行比较

Reactjs 将this.props.prop和nextrops.prop与mobx进行比较,reactjs,mobx,Reactjs,Mobx,有没有办法用mobx做这样的事情 componentWillUpdate(nextProps) { if (this.props.prop !== nextProps.prop) { /* side effect, ex. router transition */ } } 根据我的经验,即使在componentWill-hooks中,this.props.prop始终等于nextrops.prop 这里的UPD是更具体的用例-简单登录场景: 贮藏 反应部分 因此,基本上,我只想

有没有办法用mobx做这样的事情

componentWillUpdate(nextProps) {
  if (this.props.prop !== nextProps.prop) {
    /* side effect, ex. router transition */
  }
}
根据我的经验,即使在componentWill-hooks中,this.props.prop始终等于nextrops.prop

这里的UPD是更具体的用例-简单登录场景:

贮藏

反应部分


因此,基本上,我只想在99.9%的情况下,当查看器id从未定义切换到某个对象时,我能够做一些事情,这是因为代码中的其他部分道具直接发生了变化。这在react中是不允许的

典型场景包括:

var myObject = this.props.someObject;  // myObject is a POINTER to props, not copy
myObject.attribute = newAttribute;     // Now props are directly mutated

var myArray = this.props.someArray;
myArray.splice(a,b);                   // splice directly mutates array

要解决此问题,请在更新道具之前对道具对象进行适当的复制。

在99.9%的情况下,发生这种情况是因为代码中的其他地方道具直接发生了变异。这在react中是不允许的

典型场景包括:

var myObject = this.props.someObject;  // myObject is a POINTER to props, not copy
myObject.attribute = newAttribute;     // Now props are directly mutated

var myArray = this.props.someArray;
myArray.splice(a,b);                   // splice directly mutates array

要解决这个问题,请在更新道具之前对道具对象进行适当的复制。

事实上,问题发生了,因为我将一个mobx存储作为单个道具传递,以便调用它的方法,例如:this.props.store.update,所以即使存储中发生了更改,组件也会由mobx更新,nextProps仍然保留对该存储的相同引用


当我需要这种检查时,我最终将存储解构到组件的道具中。

事实上,问题发生了,因为我将一个mobx存储作为单个道具传递给它,以便调用它的方法,如:this.props.store.update,所以即使存储中发生了变化,组件也会由mobx更新,nextProps仍然保留对该存储的相同引用


当我需要这种检查时,我最终将存储解构到组件的道具中。

感谢您的更新,这澄清了很多问题。这在一定程度上取决于您想要做什么,但是如果您想要更改组件的呈现,那么使用mobx react包中的@observer来装饰组件就足够了。当存储更改时,它将自动重新渲染

如果要执行任何其他操作,可以在组件willmount中设置自动运行。像

但我不经常看到这种模式,因为在你的商店里有这种逻辑通常更干净。就我个人而言,我希望登录表单组件看起来像这样:

@observer class RequiresLogin extends Component {
    render() {
        if (this.props.viewerStore.id !== undefined) {
            return this.props.children
        } else {
            return <LoginPage viewer={this.props.viewerStore}/>
        }
    }
}

@observer class MyTestPage extends Component {
    render() {
        return <RequiresLogin viewer={this.props.viewerStore}>
            Secret Area!
        </RequiresLogin>
    }
}

@observer class LogInPage extends Component {
  login = e => {
    e.preventDefault();
    this.props.viewer.login({
      // tip: use React refs or the onChange handler to update local state:
      email: e.target.elements['email'].value,
      password: e.target.elements['password'].value,
    });
  }

  render() {
    if (this.props.viewer.id)
        return null; // no need to show login form
    return (
      <div>
        <h1>Log In</h1>
        <form onSuccess={this.login}>
          <input type="text" name="email" />
          <input type="password" name="password" />
          <input type="submit" />
        </form>
        { this.props.viewer.error && (
          <div>
            <b>Error</b>: {this.props.viewer.error}
          </div>
        )}
      </div>
    );
  }
}

谢谢你的更新,这澄清了很多问题。这在一定程度上取决于您想要做什么,但是如果您想要更改组件的呈现,那么使用mobx react包中的@observer来装饰组件就足够了。当存储更改时,它将自动重新渲染

如果要执行任何其他操作,可以在组件willmount中设置自动运行。像

但我不经常看到这种模式,因为在你的商店里有这种逻辑通常更干净。就我个人而言,我希望登录表单组件看起来像这样:

@observer class RequiresLogin extends Component {
    render() {
        if (this.props.viewerStore.id !== undefined) {
            return this.props.children
        } else {
            return <LoginPage viewer={this.props.viewerStore}/>
        }
    }
}

@observer class MyTestPage extends Component {
    render() {
        return <RequiresLogin viewer={this.props.viewerStore}>
            Secret Area!
        </RequiresLogin>
    }
}

@observer class LogInPage extends Component {
  login = e => {
    e.preventDefault();
    this.props.viewer.login({
      // tip: use React refs or the onChange handler to update local state:
      email: e.target.elements['email'].value,
      password: e.target.elements['password'].value,
    });
  }

  render() {
    if (this.props.viewer.id)
        return null; // no need to show login form
    return (
      <div>
        <h1>Log In</h1>
        <form onSuccess={this.login}>
          <input type="text" name="email" />
          <input type="password" name="password" />
          <input type="submit" />
        </form>
        { this.props.viewer.error && (
          <div>
            <b>Error</b>: {this.props.viewer.error}
          </div>
        )}
      </div>
    );
  }
}

您能否描述为什么必须更改路线,以及为什么必须由接收整个门店的组件负责更改路线?例如,我希望在接收特定商品的商店中发生这种情况。也许可以共享一些代码?您能否描述为什么必须更改路线,以及为什么必须由接收整个商店的组件负责更改路线?例如,我希望在接收特定商品的商店中发生这种情况。也许可以分享一些代码?谢谢你的回答!但是我如何访问componentWillMount中的下一步?@mweststrate这个答案是否仍然是最新的?这似乎是一个非常常见的用例。我正在RN中渲染一个平面列表,并希望在长度增加时滚动到底部。MobX迫使我跳出疯狂的圈圈,简单地比较prevProps和this.props。最干净的方法是什么?谢谢你的回答!但是我如何访问componentWillMount中的下一步?@mweststrate这个答案是否仍然是最新的?这似乎是一个非常常见的用例。我正在RN中渲染一个平面列表,并希望在长度增加时滚动到底部。MobX迫使我跳出疯狂的圈圈,简单地比较prevProps和this.props。最干净的方法是什么?
@observer class RequiresLogin extends Component {
    render() {
        if (this.props.viewerStore.id !== undefined) {
            return this.props.children
        } else {
            return <LoginPage viewer={this.props.viewerStore}/>
        }
    }
}

@observer class MyTestPage extends Component {
    render() {
        return <RequiresLogin viewer={this.props.viewerStore}>
            Secret Area!
        </RequiresLogin>
    }
}

@observer class LogInPage extends Component {
  login = e => {
    e.preventDefault();
    this.props.viewer.login({
      // tip: use React refs or the onChange handler to update local state:
      email: e.target.elements['email'].value,
      password: e.target.elements['password'].value,
    });
  }

  render() {
    if (this.props.viewer.id)
        return null; // no need to show login form
    return (
      <div>
        <h1>Log In</h1>
        <form onSuccess={this.login}>
          <input type="text" name="email" />
          <input type="password" name="password" />
          <input type="submit" />
        </form>
        { this.props.viewer.error && (
          <div>
            <b>Error</b>: {this.props.viewer.error}
          </div>
        )}
      </div>
    );
  }
}