响应子组件在父状态更改后不更新

用户8896885

我正在尝试制作一个反应消息应用程序,其中频道页面由一个频道栏Channel.js(父组件)和一个通用和随机频道和一个消息列表ChannelMessage.js(子组件)组成。

目前,我可以单击频道栏并更改 url 和this.props.channelName,但是子组件显示相同的文本,无论是否Link单击。我相信这是因为ComponentDidMount在子组件中没有被调用。我将如何更新/重新渲染子组件以使 ComponentDidMount 重新加载?

频道.js

export default class Channel extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        channelName: 'general'
    };
    this.handleSignOut = this.handleSignOut.bind(this);
}

...

render() {
    return (
        <div className="container">
            <div className="row">
                <div className="channel-list col-lg-2">
                    <h2>Channels</h2>
                    <ul className="list-group">
                        <li><Link to="/channel/general"
                            onClick={() => this.setState({ channelName: 'general' })}>General</Link></li>
                        <li><Link to="/channel/random"
                            onClick={() => this.setState({ channelName: 'random' })}>Random</Link></li>
                    </ul>
                    <div className="footer-segment">
                        ...
                    </div>
                </div>
                <ChannelMessages channelName={this.state.channelName} />
            </div>
        </div>
    );
}

频道消息.js

export default class ChannelMessages extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        channelName: this.props.channelName,
        message: '',
        messages: [],
        textValue: ''
    }
    ...
}

componentWillReceiveProps(nextProps) {
    this.setState({channelName: nextProps.channelName})
}

componentDidMount() {
    this.messageRef = firebase.database().ref('messages/' + this.state.channelName);
    this.messageRef.limitToLast(500).on('value', (snapshot) => {
        let messages = snapshot.val();
        if (messages !== null) {
            let newMessages = [];
            for (let message in messages) {
                newMessages.push({
                    author: {
                        displayName: messages[message].author.displayName,
                        photoURL: messages[message].author.photoURL,
                        uid: messages[message].author.uid
                    },
                    body: messages[message].body,
                    createdAt: messages[message].createdAt,
                    id: message
                });
            }
            this.setState({ messages: newMessages, textValue: newMessages.body });
        }
        console.log(this.state.textValue)
    });
}

componentWillUnmount() {
    this.messageRef.off('value');
}

handleSubmitMessage(event) {
    event.preventDefault();
    let user = firebase.auth().currentUser;
    this.messageRef.push().set({
        author: {
            displayName: user.displayName,
            photoURL: user.photoURL,
            uid: user.uid
        },
        body: this.state.message,
        createdAt: firebase.database.ServerValue.TIMESTAMP
    });
    this.setState({ message: '' });
}

...

render() {
    return (...);
}

}

ztadic91

为什么不直接从道具中使用 channelName ?您正在使用 componentDidMount 事件。它只运行一次。如果您想在传递新频道名称时运行 firebase 代码;提取获取逻辑函数并在componentDidMount和componentDidUpate中运行(检查这里是否与之前的不同)

ComponentDidMount 只运行一次 -更多在这里

ComponentDidUpdate 不会在初始触发器上运行 -更多信息在这里

   export default class ChannelMessages extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            message: '',
            messages: [],
            textValue: ''
        }
        ...
    }

    componentDidMount() {
        const {channelName} = this.props;

        fetchFromDb(channelName);
    }

    componentDidUpdate(prevProps) {
        if (prevProps.channelName !== this.props.channelName) {
            fetchFromDb(this.props.channelName);            
        }
    }

    componentWillUnmount() {
        this.messageRef.off('value');
    }

    handleSubmitMessage(event) {
        event.preventDefault();
        let user = firebase.auth().currentUser;
        this.messageRef.push().set({
            author: {
                displayName: user.displayName,
                photoURL: user.photoURL,
                uid: user.uid
            },
            body: this.state.message,
            createdAt: firebase.database.ServerValue.TIMESTAMP
        });
        this.setState({ message: '' });
    }

    ...

    render() {
        return (...);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

父状态不更新子组件

来自分类Dev

父状态更改后,组件不会更新

来自分类Dev

子组件更新时更改父状态

来自分类Dev

父组件状态更新时,子组件的道具不更新

来自分类Dev

状态更改后子组件未更新

来自分类Dev

父级状态更改后,子级组件道具未更新

来自分类Dev

如果父状态值更改,如何更新子组件

来自分类Dev

父状态更改时子组件不会更新

来自分类Dev

子组件未因父状态更改而更新

来自分类Dev

父状态更改后,ReactJs子级未更新

来自分类Dev

父状态更改后,React子级未更新

来自分类Dev

父状态更新时更新子组件

来自分类Dev

父状态更新时更新子组件

来自分类Dev

更新父级状态后如何将React子级组件重置为原始状态

来自分类Dev

更新子组件状态后如何调用父组件的setState方法?

来自分类Dev

子组件不更新父项的值

来自分类Dev

当父组件的状态更新时,React 子组件不会更新

来自分类Dev

父级状态发生改变后,ReactJS子组件未更新

来自分类Dev

状态更改时组件不更新

来自分类Dev

如何从功能组件的父级更改子状态组件

来自分类Dev

React:使用异步数据更新父组件的子组件状态

来自分类Dev

反应:更改父状态而不呈现子状态

来自分类Dev

更改子组件变量时更新父组件

来自分类Dev

VueJS:更改子组件内的数据并更新父组件的数据。

来自分类Dev

为什么保存在父状态的组件不更新?

来自分类Dev

根据子组件中父组件状态的更改,在父组件上执行代码

来自分类Dev

父/子组件不响应共享对象上的更改

来自分类Dev

当父状态在React中更改时停止渲染子组件

来自分类Dev

从React中的子组件更改父状态(无Redux)

Related 相关文章

热门标签

归档