【问题标题】:react native navigator parent component is not drawn after pop弹出后未绘制本机导航器父组件
【发布时间】:2016-12-30 02:57:16
【问题描述】:

我的 Navigator 有问题...我有 2 个场景,主场景包含一个 ListView,第二个场景包含一个选择列表,允许我过滤主场景的 ListView 的元素...问题是当我从第二个场景返回时,未绘制 ListView 的过滤元素......行显示但它们是空的

我知道它们被显示是因为我用不同的颜色设置了行的样式并且颜色显示正确,我是否必须以某种方式强制渲染 ListView 组件?如果是,我应该怎么做?

这是代码的一些部分(我已经删除了不相关的部分):

class App extends Component {
  renderScene(route, navigator) {
    switch (route.id) {
      case 'Main':
        return (<Main navigator={navigator} />);
      case 'FilterByBrand':
        return (<FilterByBrand navigator={navigator} brands={route.brands} callback={route.callback}/>);
    }
  }

  render () {
    return (
      <Navigator
        initialRoute={{id: 'Main'}}
        renderScene={this.renderScene}
      />
    );
  }
}

--

class Main extends Component {
  // code removed (irrelevant)

  updateBrands(brands) {
    var filter = {};

    // code to generate filter to be used not shown, is working ok

    this.setState({ brandFilter: filter });
  }

  render () {
    return (
      <Container>
        <Header>
          <Button>
            <Icon name='md-pricetags'
              onPress={()=>this.props.navigator.push({
                id: 'FilterByBrand',
                brands: this.state.brands,
                callback: this.updateBrands}
              )}
            />
          </Button>
        </Header>
        <Content>
          <ProdList
            item={this.state.items}
            brandFilter={this.state.brandFilter}
          />
        </Content>
      </Container>
    );
  }
}

--

class ProdList extends Component {
  constructor(props) {
    super(props);

    this.dataSource = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this._filter = this._filter.bind(this);
    this._genRow = this._genRow.bind(this);
  }

  _genRow(item) {
    // code not shown (irrelevant)
  }

  _filter() {
    let output = this.props.items;

    // filtering code not shown, working ok
    return output;
  }

  render() {
    var dataSource = this.dataSource.cloneWithRows(this._filter());
    return (
      <ListView
        style={styles.container}
        dataSource={dataSource}
        renderRow={this._genRow}
        enableEmptySections={true}
      />
    );
  }
}

--

class FilterByBrand extends Component {

  selectBrand(id) {
    brands = // save here the selected brands

    // callback
    this.props.callback(brands);

    this.setState({brands: brands});
  }

  render () {
    return (
      <Container>
        <Header>
          <Button transparent onPress={()=>this.props.navigator.pop()}>
            <Icon name='ios-arrow-back' />
          </Button>
          <Title>Select brand(s)</Title>
        </Header>
        <Content>
          <List
            dataArray={this.state.brands}
            renderRow={ (brand) =>
              <ListItem onPress={() => this.selectBrand(brand.id)}>
                <Text>{brand.name}</Text>
              </ListItem>
            }
          />
        </Content>
      </Container>
    );
  }
}

【问题讨论】:

  • 我认为可能与未正确定义 _genRow 函数参数有关。根据here 所述的文档,参数为(rowData, sectionID, rowID, highlightRow)
  • 你在哪里将 paints 属性传递给 ProdList 组件?还是您没有显示该代码?我只看到brandFilter 被传递给ProdList
  • coder hacker:我已经编辑了代码来解决这个问题(我在删除部分代码发布到这里时出错了,但是函数_filter工作得很好)
  • max23: 我不明白为什么 _genRow 参数是错误的......主 ListView 的行最初显示正确......它只在应用过滤器后才会中断......你介意吗告诉我怎么了?
  • 对不起,item 参数等于 rowData 参数。如果您不使用其他 3 个参数(例如 sectionID 等),我认为应该没问题。对了,能不能把_genRow函数里的代码显示一下?

标签: listview react-native navigator


【解决方案1】:

可能是你忘记添加参考了。

var navigator;

class App extends Component {
  renderScene(route, navigator) {
    switch (route.id) {
      case 'Main':
        return (<Main navigator={navigator} />);
      case 'FilterByBrand':
        return (<FilterByBrand navigator={navigator} brands={route.brands} callback={route.callback}/>);
    }
  }

  render () {
    return (
      <Navigator
        ref={(nav) => { navigator = nav; }}
        initialRoute={{id: 'Main'}}
        renderScene={this.renderScene}
      />
    );
  }
}

【讨论】:

  • 这没有任何作用;我不认为实际上需要添加 ref 才能使 Navigator 工作。
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多