当可见性状态未更改时,为什么react-native警报组件会呈现两次?

时间:2017-06-20 21:25:47

标签: react-native expo

我有一个警报组件,只要我将代码添加到主组件中的componentWillMount,就会呈现两次。 The project is an expo project

我通过将控制警报组件可见性的属性设置为false然后调用this.startAlert()来更改componentWillMount过程中的可见性状态,从而解决了这个问题。在解决方法之前,仅在按下对话框上的按钮后才更改可见性状态。

这很有效。它会显示一次警告对话框。 this.startAlert();在承诺中执行。

componentWillMount() {

    const  setPosition = (pos) => {

        console.log(pos) ;

    // We need the "latitude" and the "longitude"
    // in order to lookup the "address" from the
    // Google maps API.
    const {
      coords: {
        latitude,
        longitude,
      },
    } = pos;

    // Fetches data from the Google Maps API then sets
    // the "address" state based on the response.
    fetch(`${URL}${latitude},${longitude}`)
      .then(resp => resp.json(), e => console.error(e))
      .then(({
        results: [
          { formatted_address },
        ],
      }) => {
            this.setAddress( formatted_address ) ;
            this.startAlert() ;         
      });
    } ;


    navigator.geolocation.getCurrentPosition(setPosition) ;

}

然而这失败了。警报组件显示两次。 this.startAlert();在获取承诺之外调用。

componentWillMount() {

    const  setPosition = (pos) => {

        console.log(pos) ;

    // We need the "latitude" and the "longitude"
    // in order to lookup the "address" from the
    // Google maps API.
    const {
      coords: {
        latitude,
        longitude,
      },
    } = pos;

    // Fetches data from the Google Maps API then sets
    // the "address" state based on the response.
    fetch(`${URL}${latitude},${longitude}`)
      .then(resp => resp.json(), e => console.error(e))
      .then(({
        results: [
          { formatted_address },
        ],
      }) => {
            this.setAddress( formatted_address ) ;      
      });
    } ;

    this.startAlert() ; 
    navigator.geolocation.getCurrentPosition(setPosition) ;

}

为什么当可见性状态未更改时,react-native警报组件会呈现两次?

编辑:设置地址的代码。

// Getter for "Immutable.js" state data...
get data() {
  return this.state.data;
}

// Setter for "Immutable.js" state data...
set data(data) {
  this.setState({ data });
}

setAddress = (address) => {
    this.data = this.data.set('address', address ) ;
}

1 个答案:

答案 0 :(得分:1)

可能有助于突出显示两个代码片段之间的特定差异,因为乍一看甚至一点点阅读它们看起来大致相同。 this.setAddress(...)的定义似乎不包括在内,但它是否过渡性地称为this.setState(...)this.setState(...)导致重新呈现this