Tôi đã gặp một vấn đề về các tiểu bang dựa trên các thuộc tính.Thay đổi trạng thái khi thuộc tính thay đổi và gắn kết đầu tiên trên React - Thiếu chức năng?
Kịch bản
Tôi có phụ huynh thành phần tạo thuộc tính chuyển cho thành phần con. Thành phần con phản ứng theo tài sản nhận được. Phản ứng cách duy nhất để thay đổi trạng thái của một thành phần là sử dụng hàm componentWillMount hoặc componentDidMount và componentWillReceiveProps như tôi đã thấy (trong số những người khác, nhưng hãy tập trung vào những thành phần này, vì getInitialState chỉ được thực hiện một lần) .
Vấn đề của tôi/Câu hỏi
Nếu tôi nhận được một tài sản mới từ cha mẹ và tôi muốn thay đổi trạng thái, chỉ có componentWillReceiveProps chức năng sẽ được thực hiện và sẽ cho phép tôi thực hiện setstate. Render không cho phép setStatus.
Nếu tôi muốn đặt trạng thái lúc đầu và thời gian nhận trạng thái mới thì sao? Vì vậy, tôi phải đặt nó trên getInitialState hoặc componentWillMount/componentDidMount. Sau đó, bạn phải thay đổi trạng thái tùy thuộc vào các thuộc tính sử dụng componentWillReceiveProps.
Đây là vấn đề khi tiểu bang của bạn phụ thuộc nhiều vào tài sản của bạn, hầu như luôn luôn như vậy. Điều này có thể trở nên ngớ ngẩn vì bạn phải lặp lại các trạng thái mà bạn muốn cập nhật theo thuộc tính mới.
Giải pháp của tôi
Tôi đã tạo ra một phương pháp mới mà nó được gọi là trên componentWillMount và trên componentWillReceiveProps. Tôi đã không tìm thấy bất kỳ phương pháp được gọi là sau khi một tài sản đã được cập nhật trước khi render và cũng là lần đầu tiên các thành phần được gắn kết. Sau đó, sẽ không có cần phải làm việc này ngớ ngẩn.
Dù sao, ở đây câu hỏi: không có tùy chọn nào tốt hơn để cập nhật trạng thái khi một thuộc tính mới được nhận hoặc thay đổi không?
/*...*/
/**
* To be called before mounted and before updating props
* @param props
*/
prepareComponentState: function (props) {
var usedProps = props || this.props;
//set data on state/template
var currentResponses = this.state.candidatesResponses.filter(function (elem) {
return elem.questionId === usedProps.currentQuestion.id;
});
this.setState({
currentResponses: currentResponses,
activeAnswer: null
});
},
componentWillMount: function() {
this.prepareComponentState();
},
componentWillReceiveProps: function (nextProps) {
this.prepareComponentState(nextProps);
},
/*...*/
tôi cảm thấy một chút ngu ngốc, tôi đoán tôi mất một cái gì đó ... Tôi đoán có một giải pháp để giải quyết việc này.
Và yeah, tôi đã biết về điều này: https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html