反应 - 更新孩子

时间:2017-02-13 19:34:15

标签: reactjs react-native

我试着根据父状态更新孩子。

在父母:

<ImageGallery id={this.state.id} images={this.state.images} />

在孩子身上:

  render(){
    console.log("Rendering.............. gallery ");
    console.log(this.props.images);
    var images =  this.props.images.map(function(image, i){
      return (
       <Image key={image.id} source={image.source} style={{width: 400, height: 400}}></Image>
      );
    });

    console.log("Array of images to render: => ");
    console.log(images);
    return (
      <View>{images}</View>
    );
  }

但是渲染只被调用一次,因为原始状态为空,数据在父组件上的数据被提取。

编辑回答问题

  

如何更新父组件的状态以及您希望如何更新&gt; child? - havenchyk

因为孩子正在引用该状态:

//Here
images={this.state.images}

编辑2

这是我的组件安装:

1-请求图像对象列表 2-然后将这些图像作为blob 3-使用base64显示图像 4-创建要在子对象上使用的Source对象 5-改变状态

async componentDidMount() {
    try{
      let response = await API.get(`communities/${this.state.id}/community-pictures`);

      let json = await response.json();

      if (!response.ok) {
        throw json;
      }

      let images = json.data;
      let newImages = [];

      images.forEach(async (image) => {
        let response = await API.request_blob(`communities/${this.state.id}/community-pictures/${image.id}/view`);
        let data = await response.base64();

        let type = response.respInfo.headers['Content-Type'];
        let imageUri = `data:${type};base64,` + data;

        let source = {uri: imageUri, scale: 1};

        newImages.push(Object.assign(image, {source: source}));
      });

      this.setState({
        images: newImages
      });

      console.log("Changing images!!");
      console.log(this.state);

    } catch (json) {
      // Surppressing this error
    }
  }

您可以查看孩子的渲染。它使用 this.props.images 来安装屏幕。但不行。家长会更改其状态,且孩子不会更新。

EDIT SUPER WIERD 伙计们,我发现了一些非常奇怪的东西。我在componentDidMount上放了一些console.log来查看新状态。检查OUT打印的是什么:

enter image description here

但是,当我打开对象以查看数组时,请查看它:

enter image description here

WOW !!什么是hapennin?!

2 个答案:

答案 0 :(得分:2)

通过setState(state)更改组件的状态后,调用当前组件的重新呈现,因为如果组件的状态不等于下一个状态,则方法shouldComponentUpdate的默认实现将返回true。您可以阅读更多相关信息here

因此,您的组件已更新,并且调用了render()方法。接下来反应称为子元素的shouldComponentUpdate

有一个如何反应渲染元素的例子。 Should component update scheme

vDOMEq表示呈现的React元素是等效还是否。 There是关于它的文档。

因此,当您更新子组件SCU的道具时,返回false,因此不需要重新渲染。怎么能避免这个?只需自己实施SCU

shouldComponentUpdate(nextProps, nextState) {
   nextProps.propToChange !== this.props.propToChange
}

请记住不要改变你的道具,因为如果你愿意 - 相等的检查将返回false(因为refs是相同的),你会得到一些意想不到的错误。

答案 1 :(得分:1)

问题是images.forEach(async (image) => {正在执行async。

因此,当React要检查它是否应该渲染时,它会比较一个空数组并且什么也不渲染。

然后,这些异步调用完成,当您更改同一引用newImages的内容时,您的console.log更改。

解决方案是删除async forEach,你可以将所有内容放在异步函数中并调用如下:

let images = json.data;
let newImages = [];

for (int index = 0; index < images.length; images++) {
    let img = await fetch(images[index]);
    newImages.push(img);
}