2017-01-11 16 views
6

Tôi mới sử dụng React. Tôi bị mắc kẹt về điều này, sẽ thực sự đánh giá cao một số trợ giúp!Tiểu bang không cập nhật khi nhận được đạo cụ mới (ReactJS)

Thành phần chính sẽ chuyển mảng vào thành phần con này. Khi tôi console.log (this.props.repairs) nó cho tôi thấy một mảng của 4. Tôi đang cố gắng để cập nhật this.state.sortedDataList bất cứ khi nào mảng sửa chữa được thông qua in Console.log (this.state) vẫn còn hiển thị sortDataList dưới dạng một mảng trống.

Tôi đang làm gì sai? Cảm ơn rất nhiều, đánh giá cao sự giúp đỡ nào.

class Repairs extends React.Component { 
    constructor(props) { 
    super(props); 

    this.state = { 
     sortedDataList: [] 
    }; 
    } 

    componentWillReceiveProps(nextProps) { 
    if(this.props != nextProps) { 
     this.setState({ 
     sortedDataList: this.props.repairs 
     }); 
    } 
    } 

    render() { 
    console.log(this.props); 
    console.log(this.state); 

    return (
     <div></div> 
    ); 
    } 
} 
+2

Câu trả lời từ Jayce444 và Shubham là chính xác. Tôi sẽ thêm rằng bạn nên thực sự xác định xem bạn cần nhà nước để đại diện cho những gì bạn muốn hiển thị trên trang hoặc nếu bạn có thể sử dụng đúng đạo cụ. Có các thành phần phản ứng chức năng 'thuần túy' (các thành phần chỉ hiển thị dựa trên những gì có trong đạo cụ) luôn là mục tiêu tốt. –

+0

Tại sao bạn đặt đạo cụ cho tiểu bang? những gì tốt mà làm cho bạn? bây giờ bạn có một bóng của cùng một dữ liệu được lưu trữ trong tiểu bang cũng như đạo cụ. Để thêm vào đó đạo cụ được coi là bất biến có nghĩa là bạn không và không nên thay đổi chúng. thiết lập đạo cụ để nhà nước như thế này là làm cho dữ liệu bất biến của bạn bây giờ có thể thay đổi, đó là một Anti-Pattern và là một không lớn không. Đọc phần này để hiểu thêm http://stackoverflow.com/a/28785276/2733506 –

Trả lời

1

componentWillReceiveProps không được gọi trên lần hiển thị đầu tiên. Đó là lý do mà bạn không thấy bất kỳ bản cập nhật trong tiểu bang

Từ React Docs:

". Viện dẫn khi một thành phần được nhận đạo cụ mới phương pháp này không kêu gọi ban đầu render"

Nếu bạn chỉ muốn thay đổi lần đầu tiên, bạn có thể sử dụng chức năng vòng đời componentWillMount và cập nhật trạng thái. Ngày tiếp theo thay đổi bạn componentWillReceiveProps sẽ được gọi.

class Repairs extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 

 
    this.state = { 
 
     sortedDataList: [] 
 
    }; 
 
    } 
 

 
    componentWillMount() { 
 
    
 
     this.setState({ 
 
     sortedDataList: this.props.repairs 
 
     },() => console.log(this.state.sortedDataList)); 
 
    
 
    } 
 
    componentWillReceiveProps(nextProps) { 
 
    if(this.props != nextProps) { 
 
     this.setState({ 
 
     sortedDataList: nextProps.repairs 
 
     }); 
 
    } 
 
    } 
 

 
    render() { 
 
    console.log("r",this.props); 
 
    console.log("r",this.state); 
 

 
    return (
 
     <div></div> 
 
    ); 
 
    } 
 
} 
 

 
class App extends React.Component { 
 
    render() { 
 
    var arr = ["1", "2", "3"]; 
 
    return (
 
     <div > 
 
     <Repairs repairs={arr}/> 
 
     </div> 
 
    ) 
 
    } 
 
} 
 
ReactDOM.render(<App/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script> 
 
<div id="app"></div>

+0

Cảm ơn bạn đã trả lời. Trên thực tế, tôi nhận thấy, khi tôi lần đầu tiên nhấn vào tuyến đường, tất cả các console.log đi qua như là initialState của mảng trống. Nhưng sau khi các cuộc gọi async gửi các đạo cụ cho cha mẹ và được truyền xuống, và nó nhấn chức năng componentWillReceiveProps. Nhưng điều này khiến tôi đặt câu hỏi về vòng đời, và tôi đã tìm thấy sai lầm ngớ ngẩn của mình. Nó phải là this.setState ({ được sắp xếpDataList: nextProps.repairs }); –

0

Trong constructor của bạn

this.state = { 
    sortedDataList: [] 
}; 

Bạn bước đầu thiết lập trạng thái cho một mảng trống rỗng, vân vân đầu tiên làm cho nó sẽ được sản phẩm nào. Sau đó, bất cứ khi nào các đạo cụ được thay đổi, nó sẽ được cập nhật thông qua componentWillReceiveProps().

Như Shubham đã nói, componentWillReceiveProps() không được gọi trên kết xuất đầu tiên. Nếu bạn muốn trạng thái phản ánh các đạo cụ ngay từ lần render đầu tiên, bạn phải đặt nó vào trong hàm tạo như sau:

this.state = { 
    sortedDataList: this.props.repair 
}; 
+2

chỉ định đạo cụ cho trạng thái ban đầu là một mẫu chống và chúng ta không nên theo dõi điều đó. http://stackoverflow.com/questions/28785106/reactjs-why-is-passing-the-component-initial-state-a-prop-an-anti-pattern.Mặc dù tôi đồng ý một giải pháp đơn giản, nhưng tôi cố tình không đề cập đến nó vì lý do trên –

+0

Ah ok, điểm tốt – Jayce444

4

Đừng bận tâm, đã tìm thấy sai lầm ngớ ngẩn của tôi! Nếu bất kỳ ai khác bị kẹt trong tương lai này ...

componentWillReceiveProps(nextProps) { 
    if(this.props != nextProps) { 
    this.setState({ 
     sortedDataList: nextProps.repairs 
    }); 
    } 
} 
+0

Tóm lại, vấn đề là setState được gọi với đạo cụ hiện tại thay vì đạo cụ tiếp theo. – Aaron

Các vấn đề liên quan