javascript - 如何使用 setState 将对象添加到数组列表

标签 javascript react-native

我正在尝试使用以下方法将此对象 { "origin": "user", "message": this.state.message } 添加到 messages 数组列表中设置状态。现在我收到以下错误:

Invariant Violation: Objects are not valid as React child (found:object with keys {origin, message})

此外,如果有比 setTimeout 更好的方法来等待消息呈现后再滚动到底部,那就太酷了!

sendMessage = () => {

    this.setState(prevState => ({
        messages: [...prevState.messages, {  "origin": "user", "message": this.state.message  }]
    }));

    this.callChatService().then((responseJson) => {
        this.setState({
            context: responseJson.context
        });
        for (var i = 0; i < responseJson.output.generic.length; i++) {
            this.setState(prevState => ({
                messages: [...prevState.messages, { "origin": "bot", "message": responseJson.output.generic[i].text}]
            }));
        }
    })
    setTimeout(() => this.refs.flatList.scrollToEnd(), 1500);
    this.setState({
        message: ""
    })
}


renderItem = ({ item }) => {
    if (item.origin == "user") {
        return (
            <View>
                <View style={styles.rowRight}>
                    <Text style={styles.message}>{item}</Text>
                </View>
            </View>
        );
    }
    else {
        return (
            <View>
                <View style={styles.rowLeft}>
                    <Text style={styles.message}>{item}</Text>
                </View>
            </View>
        );
    }
}

componentWillMount() {
}

render() {
    return (

        <View style={styles.container}>
            <View style={styles.header}>
                <Text style={styles.title}>{this.state.header}</Text>
            </View>
            <FlatList
                style={styles.list}
                ref="flatList"
                data={this.state.messages}
                keyExtractor={(item, index) => index}
                renderItem={this.renderItem}
            />

            <KeyboardAvoidingView behavior="padding" keyboardVerticalOffset={20}>
            <View style={styles.footer}>
            <TextInput
                value={this.state.message}
                onChangeText={text => this.setState({ message: text })}
                style={styles.input}
                underlineColorAndroid="transparent"
                placeholder="Ask me anything"
                    />
                    <TouchableOpacity onPress={this.sendMessage} style={styles.sendButton} >
                        <Icon name="send" type="material-icon" size={28} color="#00B2EE" />
                    </TouchableOpacity>
        </View>
            </KeyboardAvoidingView>
        </View>
    );
}

最佳答案

问题出在 renderItem 方法的这些行中:

<Text style={styles.message}>{item}</Text>
此上下文中的

item 是一个对象,无法由 Text 组件呈现,因此会出现错误。

考虑到你的代码,我相信它应该是 item.message 像这样:

<Text style={styles.message}>{item.message}</Text>

关于javascript - 如何使用 setState 将对象添加到数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725840/

相关文章:

javascript - react-native 和 react-navigation 无法将函数作为参数传递到 NavigationOptions 中的下一个屏幕

ios - Animated.View + Pan Responder 导致 React Native 中的每个像素重新渲染

javascript - 为什么在 Google Chrome 和 Internet Explorer 中单击弹出窗口的关闭按钮后,youtube 视频在后台运行?

javascript - 按顺序配对数组中的项目

node.js - React Native - 运行 "npm start"和 "react-native run-android"时出错

javascript - 需要指定屏幕 react native tabnavigator

javascript - 表单提交时 &lt;iframe&gt; 背景发生变化

javascript - 为什么使用 css3-mediaqueries.js 时我的 100% 宽元素会变成 30000px+ 宽?

javascript - 为自动弹出窗口添加关闭按钮

javascript - 如何计算用户在 React Native 中花费的特定屏幕上的时间