2017-08-17 23 views
-1

例如,我有这样的代码:在React.js中从this.setState()调用this.setState()会不好吗?

class Example extends Component { 
    constructor() { 
    super(); 
    this.state = { 
     value: "", 
     disabled: false, 
     isLoaderOpened: false 
    }; 
    } 

    render() { 
    return (
     <div> 
     <input 
      value={this.state.value} 
      onChange={this.onChange} 
      disabled={this.state.disabled} 
     /> 
     <button onClick={this.onClick}>Load</button> 
     {this.state.isLoaderOpened && <div>Loading</div>} 
     </div> 
    ); 
    } 

    onClick =() => this.fetchData(this.state.value); 

    onChange = e => this.setState({ value: e.target.value }); 

    fetchData = value => { 
    Promise.resolve() 
     .then(() => this.setState({ disabled: true },() => showLoader())) 
     .then(() => this.handleRequest(this.props.url, value)) 
     .then(res => 
     this.setState({ data: res.json() },() => this.hideLoader()) 
    ); 
    }; 

    showLoader =() => this.setState({ isLoaderOpened: true }); 

    hideLoader =() => this.setState({ isLoaderOpened: false }); 

    handleRequest = (url, value) => fetch(url + "?value=" + value); 
} 

这样做不好,我从setState函数调用,也使用setState?我想重复使用经常使用的方法,为简洁起见,将它们作为setState中的回调传递是很舒服的。

+0

为什么不只需在原始setState调用中设置打开的加载器? – Neal

+0

你可以在那里设置你需要的状态的所有部分,而不是调用一个相同的方法。不过,我会说,单独使用“隐藏”和“显示”方法是不好的。使用“切换”功能,根据需要传递“true”或“false”。 – jmargolisvt

+0

@Neal因为如果在某些地方我使用原始setState调用并在某个地方 - showLoader/hideLoader方法 –

回答

0

setState()称为两次或更多次真的不好。 在你的情况,你可以尝试通过一个参数去的hideLoader()showLoader() 例如:

showLoader = (otherState = {}) => this.setState({ ...otherState, isLoaderOpened: true }); 

hideLoader = (otherState = {}) => this.setState({ ...otherState, isLoaderOpened: false }); 

,那么你可以通过另一种状态,你想改变进入方法:

fetchData = value => { 
    Promise.resolve() 
     .then(() => this.setState({ disabled: true },() => showLoader())) 
     .then(() => this.handleRequest(this.props.url, value)) 
     .then(res => 
      this.hideLoader({ data: res.json() }) 
    ); 
}; 
相关问题