The current length of the messages, respecting the user defined length
property on the component
Called immediately before mounting occurs, and before Component#render
.
Avoid introducing any side-effects or subscriptions in this method.
This method will not stop working in React 17.
Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps prevents this from being invoked.
Called when the component may be receiving new props. React may call this even if props have not changed, so be sure to compare new and existing props if you only want to handle changes.
Calling Component#setState
generally does not trigger this method.
This method will not stop working in React 17.
Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps prevents this from being invoked.
Called immediately before rendering when new props or state is received. Not called for the initial render.
Note: You cannot call Component#setState
here.
This method will not stop working in React 17.
Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps prevents this from being invoked.
Catches exceptions generated in descendant components. Unhandled exceptions will cause the entire component tree to unmount.
Called immediately after a component is mounted. Setting state here will trigger re-rendering.
Called immediately before mounting occurs, and before Component#render
.
Avoid introducing any side-effects or subscriptions in this method.
Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps prevents this from being invoked.
Called when the component may be receiving new props. React may call this even if props have not changed, so be sure to compare new and existing props if you only want to handle changes.
Calling Component#setState
generally does not trigger this method.
Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps prevents this from being invoked.
Called immediately before a component is destroyed. Perform any necessary cleanup in this method, such as
cancelled network requests, or cleaning up any DOM elements created in componentDidMount
.
Called immediately before rendering when new props or state is received. Not called for the initial render.
Note: You cannot call Component#setState
here.
Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps prevents this from being invoked.
Runs before React applies the result of render
to the document, and
returns an object to be given to componentDidUpdate. Useful for saving
things such as scroll position before render
causes changes to it.
Note: the presence of getSnapshotBeforeUpdate prevents any of the deprecated lifecycle events from running.
Imperatively creates some input
the user input to create
Called to determine whether the change in props and state should trigger a re-render.
Component
always returns true.
PureComponent
implements a shallow comparison on props and state and returns true if any
props or states have changed.
If false is returned, Component#render
, componentWillUpdate
and componentDidUpdate
will not be called.
Used to determine if the extraData
has changed. We prefer this over componentDidUpdate
because this is called
before the render happens rather than after. This means that when the extraData
is changed we can just
do a single render.
A chat message list.
export class ChatChatScreen extends React.PureComponent<IProps, IState> { constructor(props: IProps) { super(props);
this.state = { messages: [] }
}
render(): React.ReactNode { const { messages } = this.state;
return ( <View style={styles.container}> <Chat<string> user={user} messages={messages} onInput={this.handleInput} onSend={this.handleSend} onRenderMessage={this.handleRenderMessage} /> <KeyboardSpacer /> </View> );
}
private readonly handleInput = async ( { data, ...rest }: IMessageMutable
): Promise<IMessageImmutable> => {
const text = isIUserInputText(data) ? data.text : 'Unsupported Input...';
return { ...rest, data: text };
}
private readonly handleSend = async (message: IMessageImmutable): Promise => {
this.setState(({ messages }) => {
messages.unshift(message);
return { messages };
})
}
private readonly handleRenderMessage = (message: IMessageImmutable): Element => {
const person = message.user === user ? styles.messageContainerUs : styles.messageContainerThem;
return (
<View style={[styles.messageContainer, person]}>
{message.data}
);
}
}