当前位置: 首页 > 知识库问答 >
问题:

React Native,警告:失败proType:无效prop内容提供预期的单个ReactElement

姬凡
2023-03-14

我正在使用反应本地手风琴的可折叠列表视图。我的代码是下风箱。它的工作,但它给两个警告:

警告:失败的propType:提供给Accordion的prop内容无效,应为单个元素。检查StaticRenderer的渲染方法。

警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查手风琴的渲染方法。它是从一个孩子那里传来的。

知道怎么修吗?或者有什么更好的方法为每个标题提供多个内容?(折叠列表视图与儿童)

class Courses extends Component {

  constructor(props) {
        super(props);
        this.state = {
          dataSource: new ListView.DataSource({
            rowHasChanged: (row1, row2) => row1 !== row2,
          }),
          loaded: false,
        };
        this.rowPressed = this.rowPressed.bind(this);
    }
  rowPressed(data) {
    console.log('row press');
  }

  fetchData() {
/// fetching data .....
  }

  componentDidMount() {
    this.fetchData();
  }

  render() {
    if (!this.state.loaded) {
      return this.renderLoadingView();
    }

    return (
      <View style={{ flex: 1 }}>
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderRow}
        style={styles.listView}
      />
      </View>
    );
  }

  renderRow(data) {
    var header = (
      <View>
          <View style={styles.rowContainer}>
            <View  style={styles.textContainer}>
              <Text style={styles.title}>{data.nid}</Text>
              <Text style={styles.description} numberOfLines={0}>{data.title}</Text>
            </View>
          </View>
          <View style={styles.separator}/>
        </View>
    );
///////////
    var content = [];
    for(var x=0; x < Object.keys(data.course).length; x++){
      content.push(
        <View style={styles.rowContainer}>
        <TouchableHighlight onPress={() => this.rowPressed(data.course[x].course_id).bind(this)} underlayColor='#e3e0d7'>
        <Text style={styles.child}>{data.course[x].title}</Text>
        </TouchableHighlight>
        </View>
      );
    }
////////////
    return (
      <Accordion
        header={header}
        content={content}
        easing="easeOutCubic"
      />
    );
  }

  renderLoadingView() {
    return (
      <View style={styles.loading}>
        <Text style={styles.loading}>
          Fetching Courses, please wait...
        </Text>
      </View>
    );
  }
}

module.exports = Courses;

提前谢谢!

更新:现在第一个错误消失了,但它在一行中显示了数组中的所有行。我尝试添加{'\n'},但没有效果。知道怎么解决吗?还是应该使用样式表?

var content = [];
    for(var x=0; x < Object.keys(data.course).length; x++){
      content.push(

        <TouchableHighlight underlayColor='#e3e0d7'>
        <Text style={styles.child}>{data.course[x].title}</Text>
        </TouchableHighlight>

      );
    }
    var clist = (
      <View style={styles.rowContainer}>
      {content}
      </View>
    );
////////////
    return (
      <Accordion
        header={header}
        content={clist}
        easing="easeOutCubic"
      />
    );

更新2:

添加一个键到触摸突出显示并修复了第二个问题。谢谢

共有1个答案

仲孙才捷
2023-03-14

所以我在facebook上看了一个listview的例子,他们就以这个为例。要消除第二个警告,请尝试提供属性。此示例在\u renderoperator函数中提供它

 <UIExplorerPage
    title={this.props.navigator ? null : '<ListView>'}
    noSpacer={true}
    noScroll={true}>
    <ListView
      dataSource={this.state.dataSource}
      renderRow={this._renderRow}
      renderScrollComponent={props => <RecyclerViewBackedScrollView {...props} />}
      renderSeparator={this._renderSeperator}
    />
  </UIExplorerPage>

这里是renderSeperator和它的样子

 _renderSeperator: function(sectionID: number, rowID: number, adjacentRowHighlighted: bool) {
    return (
      <View
        key={`${sectionID}-${rowID}`}
        style={{
          height: adjacentRowHighlighted ? 4 : 1,
          backgroundColor: adjacentRowHighlighted ? '#3B5998' : '#CCCCCC',
        }}
      />
    );
  }
});

您可以在这里查看完整的示例https://facebook.github.io/react-native/docs/listview.html

和其他stackoverflow建议在这里警告:数组或迭代器中的每个孩子都应该有一个唯一的“键”道具。检查ListView的渲染方法

至于第一个警告,看起来你的手风琴的内容属性有问题。当它应该只有一个元素时,你给它一个元素数组。尝试将数组包装在一个单一的

因为看起来你的Conent在

  <Accordion
    header={header}
    content={content}
    easing="easeOutCubic"
  />

看起来是这样的

`<Content />
<Content />
<Content />
<Content />
<Content />
//etc... one for every row in the array`

我无法测试,因为我没有mac电脑,请确认。

 类似资料:
  • 我正在尝试新的react-router 1.0.0,但我收到了无法解释的奇怪警告: 该应用程序很简单: speaker.jsx: jsx只有以下render()函数: 当我输入到#/speaker或#speaker的路由时,除了title之外,什么都不会显示。请帮忙。

  • 我得到这个错误: index.js:1375警告:失败的道具类型:提供给的道具无效。 我在我的应用程序中使用了一个外部组件,它是从github获得的,可以在后台渲染视频。这里是链接。https://github.com/samAbeywickrama/reactjs-videobg 它与proptypes有关,但由于它的遗留和react建议使用flo,所以我根本不使用类型检查。

  • https://gist.github.com/js08/dfeab2df8b68240297eb > 我正在尝试为jsx文件编写测试用例 在这方面,我能够通过proptypes 但不是在我顺利通过的地方 我在运行测试用例时出错 下面提供我的错误、测试用例和代码 警告:失败的道具类型:提供给的无效道具 我不知道该怎么做 发生在这次活动中 你能告诉我应该如何把它放在我的测试用例中吗 警告:失败的道具

  • 我尝试动态渲染图像。但我得到了这个错误。动态获取图像源并进行渲染的解决方案是什么? 主要组成部分。js 卡片详情。js 我也尝试过其他方法,但没有成功。我在使用此方法时遇到此错误: 未知命名模块 主要组成部分。js 卡片详情。js

  • 我有这个警告在我的项目:警告:失败的道具类型:无效的道具<代码>源代码提供给<代码>图像。我加载图像从sampleProducts.jsonRecommendend.js并通过它作为道具在Products.js,但图像不会加载,因为警告。 样本产品。json 建议。js 产品。js

  • 警告:失败的prop类型:提供给PadView的prop无效。 嗨,我是新来的react native,红色消息一直显示,但一切看起来都很好,应用程序呈现正确,但红色消息一直显示在终端上,你们知道这不是什么意思吗,谢谢你们的帮助。