Sự khác biệt giữa trạng thái và đạo cụ trong React là gì?


559

Tôi đang xem một khóa học Pluralsight về React và người hướng dẫn nói rằng không nên thay đổi đạo cụ. Bây giờ tôi đang đọc một bài viết (uberVU / Reac-guide) về đạo cụ so với trạng thái và nó nói

Cả đạo cụ và thay đổi trạng thái đều kích hoạt cập nhật kết xuất.

Sau đó trong bài viết có viết:

Đạo cụ (viết tắt của thuộc tính) là cấu hình của Thành phần, tùy chọn của nó nếu bạn có thể. Họ được nhận từ trên và bất biến.

  • Vì vậy, đạo cụ có thể thay đổi nhưng họ nên bất biến?
  • Khi nào bạn nên sử dụng đạo cụ và khi nào bạn nên sử dụng trạng thái?
  • Nếu bạn có dữ liệu mà thành phần React cần, nó có nên được chuyển qua các đạo cụ hoặc thiết lập trong thành phần React thông qua getInitialStatekhông?


7
Đây là một câu hỏi rất hay, thực sự, dường như không ai đưa ra một câu trả lời đơn giản: /
Thomas Decaux

Câu trả lời:


670

Đạo cụ và nhà nước có liên quan. Trạng thái của một thành phần thường sẽ trở thành đạo cụ của một thành phần con. Các đạo cụ được truyền cho con trong phương thức kết xuất của cha mẹ làm đối số thứ hai React.createElement()hoặc, nếu bạn đang sử dụng JSX, các thuộc tính thẻ quen thuộc hơn.

<MyChild name={this.state.childsName} />

Giá trị nhà nước của cha mẹ childsNametrở thành đứa trẻ this.props.name. Từ quan điểm của trẻ em, tên prop là bất biến. Nếu nó cần được thay đổi, cha mẹ chỉ nên thay đổi trạng thái bên trong của nó:

this.setState({ childsName: 'New name' });

và React sẽ truyền nó cho đứa trẻ cho bạn. Một câu hỏi tiếp theo tự nhiên là: nếu trẻ cần thay đổi tên prop thì sao? Điều này thường được thực hiện thông qua các sự kiện con và gọi lại cha mẹ. Đứa trẻ có thể phơi bày một sự kiện được gọi là, ví dụ , onNameChanged. Phụ huynh sau đó sẽ đăng ký sự kiện bằng cách chuyển một trình xử lý gọi lại.

<MyChild name={this.state.childsName} onNameChanged={this.handleName} />

Đứa trẻ sẽ chuyển tên mới được yêu cầu của nó làm đối số cho cuộc gọi lại sự kiện bằng cách gọi, ví dụ this.props.onNameChanged('New name'), và cha mẹ sẽ sử dụng tên trong trình xử lý sự kiện để cập nhật trạng thái của nó.

handleName: function(newName) {
   this.setState({ childsName: newName });
}

2
cảm ơn! Vì vậy, một vài câu hỏi nữa: 1. tại sao mọi người nói đạo cụ không nên thay đổi? 2. nơi bạn đặt dữ liệu bootstrapping của bạn? Trong quá trình khởi tạo thành phần như getInitialState, hoặc bạn đặt nó bên ngoài thành phần và kết xuất thành phần khi có sẵn dữ liệu?
skaterdav85

37
1. Đây là khía cạnh 'chức năng' của React. Tất cả dữ liệu (gần như) chảy xuống. Vì prop được sở hữu bởi cha mẹ, chỉ cha mẹ nên thay đổi nó. Tốt nhất, trẻ em nên không quốc tịch. Điều đó là không thể trong thực tế (xem tài liệu biểu mẫu trên trang web React). 2. Bạn có thể cho nó ăn ở trên cùng, đây là một cách làm được khuyến nghị hoặc bạn có thể lưu trữ nó trong các đối tượng riêng biệt. Một cách tiếp cận phổ biến là Flux, sử dụng các đối tượng đơn lẻ được gọi là Cửa hàng. Đây là một phần của một mô hình kiến ​​trúc lớn hơn. Nó cũng được mở nguồn từ Facebook và được thiết kế để hoạt động với React.
Todd

2
Vì vậy, các cửa hàng giống như các biến toàn cầu lớn?
SuperUberDuper

3
Có, các cửa hàng Flux là bộ đệm phía khách hàng. Ngoài ra còn có các mẫu khác như Relay được phát hành gần đây, từ Facebook và Redux.
Todd

6
Để giải quyết vấn đề này một chút: trạng thái là dữ liệu thành phần được quản lý từ bên trong, đạo cụ là dữ liệu thành phần được quản lý từ bên trên và được truyền vào.
Đánh dấu

221

Đối với giao tiếp cha mẹ-con, chỉ cần vượt qua đạo cụ.

Sử dụng trạng thái để lưu trữ dữ liệu mà trang hiện tại của bạn cần trong chế độ xem bộ điều khiển của bạn.

Sử dụng đạo cụ để truyền dữ liệu & xử lý sự kiện xuống các thành phần con của bạn.

Những danh sách này sẽ giúp hướng dẫn bạn khi làm việc với dữ liệu trong các thành phần của bạn.

Đạo cụ

  • là bất biến
    • cho phép React kiểm tra tham chiếu nhanh
  • được sử dụng để truyền dữ liệu xuống từ trình điều khiển xem của bạn
    • thành phần cấp cao nhất của bạn
  • có hiệu suất tốt hơn
    • sử dụng điều này để truyền dữ liệu đến các thành phần con

Tiểu bang

  • nên được quản lý trong trình điều khiển xem của bạn
    • thành phần cấp cao nhất của bạn
  • là đột biến
  • có hiệu suất kém hơn
  • không nên được truy cập từ các thành phần con
    • thay vào đó với đạo cụ

Để liên lạc giữa hai thành phần không có mối quan hệ cha-con, bạn có thể thiết lập hệ thống sự kiện toàn cầu của riêng mình. Theo dõi các sự kiện trong thành phầnDidMount (), hủy đăng ký thành phầnWillUnmount () và gọi setState () khi bạn nhận được một sự kiện. Mô hình thông lượng là một trong những cách có thể để sắp xếp này. - https://facebook.github.io/react/tips/cransicate-b between - component.html

Những thành phần nào nên có Nhà nước?

Hầu hết các thành phần của bạn chỉ cần lấy một số dữ liệu từ đạo cụ và kết xuất nó. Tuy nhiên, đôi khi bạn cần phản hồi đầu vào của người dùng, yêu cầu máy chủ hoặc thời gian trôi qua. Đối với điều này, bạn sử dụng nhà nước.

Cố gắng giữ càng nhiều các thành phần của bạn càng tốt không quốc tịch . Bằng cách này, bạn sẽ tách trạng thái đến vị trí hợp lý nhất của nó và giảm thiểu sự dư thừa, giúp dễ dàng suy luận về ứng dụng của bạn.

Một mô hình phổ biến là tạo ra một số thành phần không trạng thái chỉ hiển thị dữ liệu và có một thành phần trạng thái bên trên chúng trong hệ thống phân cấp truyền trạng thái của nó cho con của nó thông qua các đạo cụ. Thành phần trạng thái đóng gói tất cả logic tương tác, trong khi các thành phần không trạng thái đảm nhiệm việc hiển thị dữ liệu theo cách khai báo. - https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-components-should-have-state

Những gì nên đi trong tiểu bang?

Trạng thái phải chứa dữ liệu mà trình xử lý sự kiện của thành phần có thể thay đổi để kích hoạt cập nhật giao diện người dùng. Trong các ứng dụng thực, dữ liệu này có xu hướng rất nhỏ và có khả năng tuần tự hóa JSON. Khi xây dựng một thành phần trạng thái, hãy nghĩ về đại diện tối thiểu có thể có của trạng thái của nó và chỉ lưu trữ các thuộc tính đó trong this.state. Bên trong render () chỉ cần tính toán bất kỳ thông tin nào khác bạn cần dựa trên trạng thái này. Bạn sẽ thấy rằng suy nghĩ và viết các ứng dụng theo cách này có xu hướng dẫn đến ứng dụng chính xác nhất, vì việc thêm các giá trị dự phòng hoặc tính toán vào trạng thái có nghĩa là bạn cần phải giữ chúng đồng bộ rõ ràng thay vì dựa vào tính toán React cho chúng. - https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-should-go-in-state


2
không đồng ý, đi tất cả các đạo cụ thực sự là ít hiệu suất để truyền dữ liệu xuống. Chỉ cần đặt cửa hàng cho các thành phần con, sau đó bạn không phải đối phó với mớ hỗn độn đạo cụ và khi đạo cụ thay đổi, bạn phải cập nhật các thành phần của mình. Chỉ cần cập nhật cửa hàng của bạn và để thành phần lấy dữ liệu từ cửa hàng của nó.
Tích cực,

Bạn có thể cho tôi biết tại sao đạo cụ có hiệu suất cao hơn các tiểu bang. cảm ơn.
hqt

@hqt Tôi nghĩ bởi vì nó bất biến, nên sự so sánh bên trong để thay đổi giá trị nhanh hơn
Gaspar

@BentOnCoding, chúc một ngày tốt lành, xin vui lòng giúp đỡ. Tôi có thể tưởng tượng trạng thái như thế Bất cứ khi nào có dữ liệu sẽ thay đổi trong một thành phần trên TƯƠNG TÁC NGƯỜI DÙNG, đây là nơi sử dụng trạng thái không?
Dickens

72

Bạn có thể hiểu nó tốt nhất bằng cách liên hệ nó với các hàm Plain JS.

Chỉ cần đặt,

Trạng thái là trạng thái cục bộ của thành phần không thể truy cập và sửa đổi bên ngoài thành phần. Nó tương đương với các biến cục bộ trong một hàm.

Hàm Plain Plain

const DummyFunction = () => {
  let name = 'Manoj';
  console.log(`Hey ${name}`)
}

Thành phần phản ứng

class DummyComponent extends React.Component {
  state = {
    name: 'Manoj'
  }
  render() {
    return <div>Hello {this.state.name}</div>;
  }

Đạo cụ , mặt khác, làm cho các thành phần tái sử dụng bằng cách cho các thành phần khả năng nhận dữ liệu từ thành phần cha mẹ của họ trong các hình thức của đạo cụ. Chúng tương đương với các tham số chức năng.

Hàm Plain Plain

const DummyFunction = (name) => {
  console.log(`Hey ${name}`)
}

// when using the function
DummyFunction('Manoj');
DummyFunction('Ajay');

Thành phần phản ứng

class DummyComponent extends React.Component {
  render() {
    return <div>Hello {this.props.name}</div>;
  }

}

// when using the component
<DummyComponent name="Manoj" />
<DummyComponent name="Ajay" />

Tín dụng: Manoj Singh Negi

Liên kết bài viết: React State vs props giải thích


16
Đây thực sự là một câu trả lời rất hữu ích. Sau khi đọc nó, tôi có thể hiểu câu trả lời đầy đủ hơn. Cảm ơn.
Aaron

1
React thành phần = hàm JS đơn giản là một cách tuyệt vời để giải thích rõ ràng điều này. Và với React di chuyển ngày càng nhiều hơn về các thành phần chức năng, điều này càng trở nên đúng nghĩa hơn.
JD Sandifer

1
lời giải thích tốt nhất tôi đã đọc, cảm ơn bạn
iWizard

48

Đạo cụ và tóm tắt trạng thái tôi thích nhất là ở đây: hướng dẫn phản ứng Mẹo đội mũ lớn cho những kẻ đó. Dưới đây là phiên bản chỉnh sửa của trang đó:


đạo cụ vs nhà nước

tl; dr Nếu một Thành phần cần thay đổi một trong các thuộc tính của nó tại một thời điểm nào đó, thuộc tính đó phải là một phần của trạng thái của nó, nếu không thì nó chỉ là một chỗ dựa cho Thành phần đó.


đạo cụ

Đạo cụ (viết tắt của thuộc tính) là cấu hình của Thành phần. Chúng được nhận từ phía trên và không thay đổi khi có liên quan đến Thành phần. Một Thành phần không thể thay đổi đạo cụ của nó, nhưng nó có trách nhiệm kết hợp các đạo cụ của các Thành phần con của nó. Đạo cụ không phải chỉ là dữ liệu - chức năng gọi lại có thể được chuyển qua dưới dạng đạo cụ.

tiểu bang

Trạng thái là cấu trúc dữ liệu bắt đầu bằng giá trị mặc định khi Thành phần gắn kết. Nó có thể bị thay đổi theo thời gian, chủ yếu là kết quả của các sự kiện người dùng.

Một thành phần quản lý nhà nước của chính nó trong nội bộ. Bên cạnh việc thiết lập trạng thái ban đầu, nó không có vấn đề kinh doanh nào với tình trạng của con cái nó. Bạn có thể khái niệm hóa trạng thái là riêng tư cho thành phần đó.

Thay đổi đạo cụ và trạng thái

                                                   đạo cụ nhà nước
    Có thể nhận được giá trị ban đầu từ Thành phần cha mẹ? Vâng vâng
    Có thể được thay đổi bởi thành phần cha mẹ? có không
    Có thể đặt giá trị mặc định bên trong Thành phần không? * Có Có
    Có thể thay đổi bên trong Thành phần? Không
    Có thể đặt giá trị ban đầu cho các Thành phần con? Vâng vâng
    Có thể thay đổi thành phần con? có không
  • Lưu ý rằng cả đạo cụ và giá trị ban đầu trạng thái nhận được từ cha mẹ đều ghi đè các giá trị mặc định được xác định bên trong Thành phần.

Thành phần này có nên có nhà nước?

Nhà nước là tùy chọn. Vì trạng thái làm tăng độ phức tạp và giảm khả năng dự đoán, nên Thành phần không có trạng thái là thích hợp hơn. Mặc dù rõ ràng bạn không thể làm mà không có trạng thái trong một ứng dụng tương tác, bạn nên tránh có quá nhiều Thành phần Trạng thái.

Các loại thành phần

Thành phần không quốc tịch Chỉ đạo cụ, không có nhà nước. Không có gì nhiều xảy ra ngoài chức năng render (). Logic của họ xoay quanh các đạo cụ họ nhận được. Điều này làm cho chúng rất dễ theo dõi, và để kiểm tra.

Thành phần nhà nước Cả đạo cụ và nhà nước. Chúng được sử dụng khi thành phần của bạn phải giữ lại một số trạng thái. Đây là một nơi tốt để liên lạc giữa máy khách và máy chủ (XHR, ổ cắm web, v.v.), xử lý dữ liệu và phản hồi các sự kiện của người dùng. Các loại hậu cần này nên được gói gọn trong một số lượng vừa phải các Thành phần Trạng thái, trong khi tất cả logic trực quan hóa và định dạng sẽ chuyển xuống dòng chảy vào nhiều Thành phần Không trạng thái.

nguồn


1
"Giá trị ban đầu nhà nước nhận được từ cha mẹ" nghĩa là gì? Theo tôi biết trạng thái chỉ được xác định trong phạm vi của một thành phần duy nhất và không thể thay đổi trực tiếp từ bên ngoài.
Maxim Kuzmin

@MaximKuzmin Tôi tin rằng đó là một tham chiếu đến mô hình phổ biến của việc sử dụng prop như 'initColor' để khởi tạo trạng thái như 'màu'. Trạng thái ban đầu được đưa ra giá trị từ prop (nhận được từ cha mẹ) và sau đó tiếp tục hoạt động như trạng thái thông thường sau đó. Có thể hơi khó hiểu khi đưa vào phần giới thiệu về trạng thái so với đạo cụ, nhưng đó là một mô hình quan trọng cần biết.
JD Sandifer

18

đạo cụ (viết tắt của các thuộc tính của người dùng) và trạng thái là cả hai đối tượng JavaScript đơn giản. Mặc dù cả hai đều chứa thông tin ảnh hưởng đến đầu ra của kết xuất, chúng khác nhau theo một cách quan trọng: đạo cụ được truyền đến thành phần (tương tự như tham số hàm) trong khi trạng thái được quản lý trong thành phần (tương tự như các biến được khai báo trong hàm).

Vì vậy, trạng thái đơn giản chỉ giới hạn ở thành phần hiện tại của bạn nhưng đạo cụ có thể được chuyển sang bất kỳ thành phần nào bạn muốn ... Bạn có thể chuyển trạng thái của thành phần hiện tại dưới dạng chống đỡ cho các thành phần khác ...

Ngoài ra trong React, chúng tôi có các thành phần không trạng thái chỉ có đạo cụ và không có trạng thái bên trong ...

Ví dụ dưới đây cho thấy cách họ làm việc trong ứng dụng của bạn:

Phụ huynh (thành phần đầy đủ nhà nước):

class SuperClock extends React.Component {

  constructor(props) {
    super(props);
    this.state = {name: "Alireza", date: new Date().toLocaleTimeString()};
  }

  render() {
    return (
      <div>
        <Clock name={this.state.name} date={this.state.date} />
      </div>
    );
  }
}

Trẻ em (thành phần không có nhà nước):

const Clock = ({name}, {date}) => (
    <div>
      <h1>{`Hi ${name}`}.</h1>
      <h2>{`It is ${date}`}.</h2>
    </div>
);

11

Sự khác biệt chính giữa đạo cụ và trạng thái là trạng thái bên trong và được điều khiển bởi chính thành phần trong khi đạo cụ ở bên ngoài và được điều khiển bởi bất kỳ thứ gì làm cho thành phần đó.

function A(props) {
  return <h1>{props.message}</h1>
}

render(<A message=”hello />,document.getElementById(“root”));


class A extends React.Component{  
  constructor(props) {  
    super(props)  
    this.state={data:"Sample Data"}  
  }  
  render() {
    return(<h2>Class State data: {this.state.data}</h2>)  
  } 
}

render(<A />, document.getElementById("root"));

Đạo cụ nhà nước VS

  • Trạng thái có thể được thay đổi (Mutable)
  • Trong khi Đạo cụ không thể (Bất biến)

7

Về cơ bản, sự khác biệt là trạng thái giống như các thuộc tính trong OOP : nó là một thứ cục bộ đối với một lớp (thành phần), được sử dụng để mô tả nó tốt hơn. Đạo cụ giống như các tham số - chúng được truyền đến một thành phần từ người gọi của một thành phần (cha mẹ): như thể bạn đã gọi một hàm với các tham số nhất định.


5

Cả trạng tháiđạo cụ trong phản ứng đều được sử dụng để kiểm soát dữ liệu thành một thành phần, nói chung các đạo cụ được đặt bởi cha mẹ và được truyền cho các thành phần con và chúng được cố định trong toàn bộ thành phần. Đối với dữ liệu sẽ thay đổi, chúng ta phải sử dụng trạng thái. Và đạo cụ là bất biến trong khi các trạng thái có thể thay đổi , nếu bạn muốn thay đổi đạo cụ, bạn có thể thực hiện từ thành phần cha mẹ và sau đó chuyển nó sang thành phần con.


4

như tôi đã học được trong khi làm việc với phản ứng.

  • các đạo cụ được sử dụng bởi một thành phần để lấy dữ liệu từ môi trường bên ngoài, tức là một thành phần khác (thuần túy, chức năng hoặc lớp) hoặc một lớp chung hoặc mã javascript / typecript

  • trạng thái được sử dụng để quản lý môi trường bên trong của thành phần có nghĩa là dữ liệu thay đổi bên trong thành phần


3

Đạo cụ: Đạo cụ không là gì ngoài tài sản của thành phần và thành phần phản ứng không là gì ngoài chức năng javascript.

  class Welcome extends React.Component {
    render() {
      return <h1>Hello {this.props.name}</h1>;
    }
  }

yếu tố const =;

ở đây <Welcome name="Sara" />chuyển một đối tượng {name: 'Sara'} làm đạo cụ của thành phần Chào mừng. Để truyền dữ liệu từ một thành phần cha mẹ sang thành phần con, chúng ta sử dụng các đạo cụ. Đạo cụ là bất biến. Các đạo cụ trong vòng đời của một thành phần không nên thay đổi (coi chúng là bất biến).

Trạng thái: trạng thái chỉ có thể truy cập trong Thành phần. Để theo dõi dữ liệu trong thành phần, chúng tôi sử dụng trạng thái. chúng ta có thể thay đổi trạng thái bằng setState. Nếu chúng ta cần truyền trạng thái cho con, chúng ta phải truyền nó làm đạo cụ.

class Button extends React.Component {
  constructor() {
    super();
    this.state = {
      count: 0,
    };
  }

  updateCount() {
    this.setState((prevState, props) => {
      return { count: prevState.count + 1 }
    });
  }

  render() {
    return (<button
              onClick={() => this.updateCount()}
            >
              Clicked {this.state.count} times
            </button>);
  }
}

3

Tiểu bang:

  1. trạng thái là đột biến.
  2. các trạng thái được liên kết với các thành phần riêng lẻ không thể được sử dụng bởi các thành phần khác.
  3. trạng thái được khởi tạo trên mount thành phần.
  4. trạng thái được sử dụng để hiển thị các thay đổi động trong thành phần.

đạo cụ:

  1. đạo cụ là bất biến.
  2. bạn có thể chuyển đạo cụ giữa các thành phần.
  3. đạo cụ chủ yếu được sử dụng để giao tiếp giữa các thành phần. Bạn có thể truyền trực tiếp từ cha mẹ sang con cái. Để truyền từ con sang cha mẹ, bạn cần sử dụng khái niệm nâng trạng thái.

class Parent extends React.Component{
  render()
  {
     return(
        <div>
            <Child name = {"ron"}/>
        </div>
      );
  }
}

class Child extends React.Component{
{
    render(){
      return(
         <div>
              {this.props.name}
        </div>
      );
     }
}


{"message": "Uncaught SyntaxError: Mã thông báo bất ngờ <", "tên tệp": " stacksnippets.net/js ", "lineno": 17, "colno": 9}
Niko Jojo

2

Về cơ bản, đạo cụ và trạng thái là hai cách mà thành phần có thể biết những gì và làm thế nào để kết xuất. Phần nào của trạng thái ứng dụng thuộc về trạng thái và phần nào của một cửa hàng cấp cao nhất, có liên quan nhiều hơn đến thiết kế ứng dụng của bạn, hơn là cách React hoạt động. Cách đơn giản nhất để quyết định, IMO, là suy nghĩ, liệu phần dữ liệu cụ thể này có hữu ích cho toàn bộ ứng dụng hay đó là một số thông tin địa phương. Ngoài ra, điều quan trọng là không trùng lặp trạng thái, vì vậy nếu một số dữ liệu có thể được tính từ đạo cụ - thì nên tính toán từ đạo cụ.

Ví dụ: giả sử bạn có một số điều khiển thả xuống (bao gồm HTML standart chọn để tạo kiểu tùy chỉnh), có thể a) chọn một số giá trị từ danh sách và b) được mở hoặc đóng (nghĩa là danh sách tùy chọn được hiển thị hoặc ẩn). Bây giờ, giả sử ứng dụng của bạn hiển thị danh sách các mục thuộc loại nào đó và bộ lọc điều khiển thả xuống của bạn cho các mục nhập danh sách. Sau đó, tốt nhất là chuyển giá trị bộ lọc hoạt động dưới dạng prop và giữ trạng thái mở / đóng cục bộ. Ngoài ra, để làm cho nó hoạt động, bạn sẽ chuyển một trình xử lý onChange từ thành phần chính, được gọi là phần tử thả xuống bên trong và gửi thông tin cập nhật (bộ lọc được chọn mới) đến cửa hàng ngay lập tức. Mặt khác, trạng thái mở / đóng có thể được giữ trong thành phần thả xuống, bởi vì phần còn lại của ứng dụng không thực sự quan tâm nếu điều khiển được mở, cho đến khi người dùng thực sự thay đổi giá trị của nó.

Đoạn mã sau không hoàn toàn hoạt động, nó cần css và xử lý các sự kiện nhấp / làm mờ / thay đổi thả xuống, nhưng tôi muốn giữ ví dụ tối thiểu. Hy vọng nó sẽ giúp hiểu được sự khác biệt.

const _store = {
    items: [
    { id: 1, label: 'One' },
    { id: 2, label: 'Two' },
    { id: 3, label: 'Three', new: true },
    { id: 4, label: 'Four', new: true },
    { id: 5, label: 'Five', important: true },
    { id: 6, label: 'Six' },
    { id: 7, label: 'Seven', important: true },
    ],
  activeFilter: 'important',
  possibleFilters: [
    { key: 'all', label: 'All' },
    { key: 'new', label: 'New' },
    { key: 'important', label: 'Important' }
  ]
}

function getFilteredItems(items, filter) {
    switch (filter) {
    case 'all':
        return items;

    case 'new':
        return items.filter(function(item) { return Boolean(item.new); });

    case 'important':
        return items.filter(function(item) { return Boolean(item.important); });

    default:
        return items;
  }
}

const App = React.createClass({
  render: function() {
    return (
            <div>
            My list:

            <ItemList   items={this.props.listItems} />
          <div>
            <Dropdown 
              onFilterChange={function(e) {
                _store.activeFilter = e.currentTarget.value;
                console.log(_store); // in real life, some action would be dispatched here
              }}
              filterOptions={this.props.filterOptions}
              value={this.props.activeFilter}
              />
          </div>
        </div>
      );
  }
});

const ItemList = React.createClass({
  render: function() {
    return (
      <div>
        {this.props.items.map(function(item) {
          return <div key={item.id}>{item.id}: {item.label}</div>;
        })}
      </div>
    );
  }
});

const Dropdown = React.createClass({
    getInitialState: function() {
    return {
        isOpen: false
    };
  },

  render: function() {
    return (
        <div>
            <select 
            className="hidden-select" 
          onChange={this.props.onFilterChange}
          value={this.props.value}>
            {this.props.filterOptions.map(function(option) {
            return <option value={option.key} key={option.key}>{option.label}</option>
          })}
        </select>

        <div className={'custom-select' + (this.state.isOpen ? ' open' : '')} onClick={this.onClick}>
            <div className="selected-value">{this.props.activeFilter}</div>
          {this.props.filterOptions.map(function(option) {
            return <div data-value={option.key} key={option.key}>{option.label}</div>
          })}
        </div>
      </div>
    );
  },

  onClick: function(e) {
    this.setState({
        isOpen: !this.state.isOpen
    });
  }
});

ReactDOM.render(
  <App 
    listItems={getFilteredItems(_store.items, _store.activeFilter)} 
    filterOptions={_store.possibleFilters}
    activeFilter={_store.activeFilter}
    />,
  document.getElementById('root')
);

2

Nhà nước là cách phản ứng đối phó với thông tin được tổ chức bởi thành phần của bạn.

Giả sử bạn có một thành phần cần lấy một số dữ liệu từ máy chủ. Bạn thường muốn thông báo cho người dùng nếu yêu cầu đang được xử lý, nếu nó không thành công, v.v ... Đây là một thông tin chỉ liên quan đến thành phần cụ thể đó. Đây là nơi nhà nước bước vào trò chơi.

Thông thường cách tốt nhất để xác định trạng thái như sau:

class MyComponent extends React.Component {
  constructor() {
    super();
    this.state = { key1: value1, key2: value2 }    
  }
}

nhưng trong các triển khai mới nhất của phản ứng bản địa, bạn chỉ có thể làm:

class MyComponent extends React.Component {
  state = { key1: value1, key2: value2 }    
}

Hai ví dụ này thực hiện theo cùng một cách chính xác, đó chỉ là một cải tiến cú pháp.

Vậy, điều gì khác với việc chỉ sử dụng các thuộc tính đối tượng như chúng ta luôn có trong lập trình OO? Thông thường, thông tin được giữ trong trạng thái của bạn không có nghĩa là tĩnh, nó sẽ thay đổi theo thời gian và Chế độ xem của bạn sẽ cần cập nhật để phản ánh các thay đổi này. Nhà nước cung cấp chức năng này một cách đơn giản.

Nhà nước là ý nghĩa để được bất khả xâm phạm! và tôi không thể làm đủ căng thẳng về điều này. Những gì hiện phương tiện này? Nó có nghĩa là bạn KHÔNG BAO GIỜ nên làm một cái gì đó như thế này.

 state.key2 = newValue;

Cách làm đúng đắn là:

this.setState({ key2: newValue });

Sử dụng this.setState thành phần của bạn chạy qua chu kỳ cập nhật và nếu bất kỳ phần nào của trạng thái thay đổi, phương thức kết xuất Thành phần của bạn sẽ được gọi lại để phản ánh các thay đổi này.

Kiểm tra tài liệu phản ứng để biết giải thích thậm chí mở rộng hơn: https://facebook.github.io/react/docs/state-and-lifecycle.html


2

Đạo cụ chỉ đơn giản là tốc ký cho tài sản. Đạo cụ là cách các thành phần nói chuyện với nhau. Nếu bạn hoàn toàn quen thuộc với React thì bạn nên biết rằng đạo cụ chảy xuống từ thành phần chính.

Cũng có trường hợp bạn có thể có các đạo cụ mặc định để các đạo cụ được đặt ngay cả khi một thành phần cha mẹ không truyền đạo cụ xuống.

Đây là lý do tại sao mọi người nhắc đến React là có luồng dữ liệu đơn hướng. Điều này sẽ khiến bạn mất một chút suy nghĩ và có lẽ tôi sẽ viết blog về điều này sau, nhưng bây giờ chỉ cần nhớ: dữ liệu chảy từ cha mẹ sang con cái. Đạo cụ là bất biến (từ ưa thích cho nó không thay đổi)

Vì vậy, chúng tôi rất vui. Các thành phần nhận dữ liệu từ cha mẹ. Tất cả đã được sắp xếp, phải không?

Vâng, không hoàn toàn. Điều gì xảy ra khi một thành phần nhận dữ liệu từ một người khác không phải cha mẹ? Điều gì xảy ra nếu người dùng nhập dữ liệu trực tiếp vào thành phần?

Vâng, đây là lý do tại sao chúng ta có nhà nước.

TIỂU BANG

Đạo cụ không nên thay đổi, vì vậy nhà nước bước lên. Thông thường các thành phần không có trạng thái và vì vậy được gọi là không trạng thái. Một thành phần sử dụng trạng thái được gọi là trạng thái. Hãy thoải mái thả miếng ngon nhỏ đó vào các bữa tiệc và quan sát mọi người tránh xa bạn.

Vì vậy, trạng thái được sử dụng để một thành phần có thể theo dõi thông tin ở giữa bất kỳ kết xuất nào mà nó thực hiện. Khi bạn setState, nó cập nhật đối tượng trạng thái và sau đó kết xuất lại thành phần. Điều này là tuyệt vời bởi vì điều đó có nghĩa là React chăm sóc công việc khó khăn và nhanh chóng.

Một ví dụ nhỏ về trạng thái, đây là đoạn trích từ thanh tìm kiếm (đáng để kiểm tra khóa học này nếu bạn muốn tìm hiểu thêm về React)

Class SearchBar extends Component {
 constructor(props) {
  super(props);
this.state = { term: '' };
 }
render() {
  return (
   <div className="search-bar">
   <input 
   value={this.state.term}
   onChange={event => this.onInputChange(event.target.value)} />
   </div>
   );
 }
onInputChange(term) {
  this.setState({term});
  this.props.onSearchTermChange(term);
 }
}

TÓM LƯỢC

Đạo cụ và Nhà nước làm những việc tương tự nhưng được sử dụng theo những cách khác nhau. Phần lớn các thành phần của bạn có thể sẽ không trạng thái.

Đạo cụ được sử dụng để truyền dữ liệu từ cha mẹ sang con hoặc bởi chính thành phần đó. Chúng là bất biến và do đó sẽ không được thay đổi.

Trạng thái được sử dụng cho dữ liệu có thể thay đổi hoặc dữ liệu sẽ thay đổi. Điều này đặc biệt hữu ích cho đầu vào của người dùng. Hãy nghĩ thanh tìm kiếm chẳng hạn. Người dùng sẽ nhập dữ liệu và điều này sẽ cập nhật những gì họ thấy.


2

Nói ngắn gọn.

giá trị đạo cụ không thể thay đổi [bất biến]

giá trị trạng thái có thể được thay đổi, sử dụng phương thức setState [có thể thay đổi]


1

trạng thái - Đây là một thuộc tính có thể thay đổi đặc biệt chứa dữ liệu Thành phần. nó có giá trị mặc định khi gắn kết.

đạo cụ - Đó là một tài sản đặc biệt không thể thay đổi về bản chất và được sử dụng trong trường hợp truyền theo giá trị từ cha mẹ sang con cái. đạo cụ chỉ là một kênh giao tiếp giữa các Thành phần, luôn luôn chuyển từ đỉnh (cha mẹ) sang mông (con).

dưới đây là ví dụ đầy đủ về việc kết hợp trạng thái & đạo cụ: -

<!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>state&props example</title>

        <script src="https://unpkg.com/react@0.14.8/dist/react.min.js"></script>
        <script src="https://unpkg.com/react-dom@0.14.8/dist/react-dom.min.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>

      </head>
      <body>
      <div id="root"></div>
        <script type="text/babel">

            var TodoList = React.createClass({
                render(){
                    return <div className='tacos-list'>
                                {
                                    this.props.list.map( ( todo, index ) => {
                                    return <p key={ `taco-${ index }` }>{ todo }</p>;
                            })}
                            </div>;
                }
            });

            var Todo = React.createClass({
                getInitialState(){
                    return {
                        list : [ 'Banana', 'Apple', 'Beans' ]       
                    }
                },
                handleReverse(){
                    this.setState({list : this.state.list.reverse()});
                },
                render(){
                    return <div className='parent-component'>
                              <h3 onClick={this.handleReverse}>List of todo:</h3>
                              <TodoList list={ this.state.list }  />
                           </div>;
                }
            });

            ReactDOM.render(
                <Todo/>,
                document.getElementById('root')
            );

        </script>
      </body>
      </html>

1

Nói chung, trạng thái của một thành phần (cha mẹ) là chỗ dựa cho thành phần con.

  1. Nhà nước cư trú trong một thành phần mà đạo cụ được truyền từ cha mẹ sang con cái.
  2. Đạo cụ nói chung là bất biến.

    class Parent extends React.Component {
        constructor() {
            super();
            this.state = {
                name : "John",
            }
        }
        render() {
            return (
                <Child name={this.state.name}>
            )
        }
    }
    
    class Child extends React.Component {
        constructor() {
            super();
        }
    
        render() {
            return(
                {this.props.name} 
            )
        }
    }

Trong đoạn mã trên, chúng ta có một lớp cha (Parent) có tên là trạng thái của nó được truyền cho thành phần con (lớp con) dưới dạng prop và thành phần con biểu hiện nó bằng cách sử dụng {this.props.name}


1

Bạn có một số dữ liệu đang được người dùng nhập vào đâu đó trong ứng dụng.

  1. thành phần mà dữ liệu đang được nhập phải có dữ liệu này ở trạng thái vì nó cần thao tác và thay đổi nó trong quá trình nhập dữ liệu

  2. bất cứ nơi nào khác trong ứng dụng, dữ liệu sẽ được truyền lại dưới dạng đạo cụ cho tất cả các thành phần khác

Vì vậy, có đạo cụ đang thay đổi nhưng chúng được thay đổi tại 'nguồn' và sau đó sẽ đơn giản chảy xuống từ đó. Vì vậy, đạo cụ là bất biến trong bối cảnh thành phần tiếp nhận chúng .

Ví dụ: màn hình dữ liệu tham chiếu nơi người dùng chỉnh sửa danh sách các nhà cung cấp sẽ quản lý trạng thái này, sau đó sẽ có hành động khiến dữ liệu cập nhật được lưu trong ReferenceDataState, có thể thấp hơn một cấp dưới AppState và sau đó danh sách nhà cung cấp này sẽ được chuyển qua làm đạo cụ cho tất cả các thành phần cần thiết để sử dụng nó.


1

Trong React, các trạng thái lưu trữ dữ liệu cũng như các đạo cụ. Sự khác biệt của nó với cái sau là dữ liệu được lưu trữ có thể được sửa đổi bằng các thay đổi khác nhau. Chúng không có gì khác hơn các đối tượng được viết bằng JavaScript phẳng, vì vậy chúng có thể chứa dữ liệu hoặc mã, thể hiện thông tin bạn muốn mô hình hóa. Nếu bạn cần biết thêm chi tiết, bạn nên xem các ấn phẩm này Sử dụng Nhà nước trong Phản ứngSử dụng Đạo cụ trong Phản ứng


1
  • đạo cụ --- bạn không thể thay đổi giá trị của nó.
  • trạng thái --- bạn có thể thay đổi giá trị của nó trong mã của mình, nhưng nó sẽ hoạt động khi kết xuất kết xuất.

1

Một số khác biệt giữa các tiểu bang khác và các đạo cụ trực tuyến trên thế giới.

Điều khiển phản ứng và kết xuất DOM dựa trên trạng thái. Có hai loại trạng thái thành phần: đạo cụ là trạng thái chuyển giữa các thành phần và trạng thái là trạng thái bên trong của các thành phần. Đạo cụ được sử dụng để truyền dữ liệu từ thành phần cha mẹ sang thành phần con. Các thành phần cũng có trạng thái riêng bên trong: trạng thái chỉ có thể được sửa đổi bên trong thành phần.

Nói chung trạng thái của thành phần nhất định có thể là đạo cụ của thành phần con, đạo cụ sẽ được truyền cho trẻ em được nêu trong phương thức kết xuất của thành phần cha


1

Đạo cụ

  • đạo cụ sử dụng để truyền dữ liệu trong thành phần con

  • đạo cụ thay đổi một giá trị bên ngoài một thành phần (thành phần con)

Tiểu bang

  • sử dụng trạng thái bên trong một thành phần lớp

  • thay đổi trạng thái bên trong một thành phần

  • Nếu bạn kết xuất trang, bạn gọi setState để cập nhật DOM (cập nhật giá trị trang)

Nhà nước có vai trò quan trọng trong phản ứng


0

Để trả lời cho câu hỏi ban đầu về đạo cụ là bất biến, chúng được cho là bất biến khi có liên quan đến thành phần con nhưng có thể thay đổi ở phụ huynh.


0

Thành phần React sử dụng trạng thái để ĐỌC / VIẾT các biến nội bộ có thể thay đổi / biến đổi bằng ví dụ:

this.setState({name: 'Lila'})

React props là đối tượng đặc biệt cho phép lập trình viên nhận các biến và phương thức từ Thành phần cha mẹ thành Thành phần con.

Nó giống như một cái cửa sổ và cánh cửa của ngôi nhà. Đạo cụ cũng là Thành phần trẻ em bất biến không thể thay đổi / cập nhật chúng.

Có một số phương pháp giúp lắng nghe khi đạo cụ được thay đổi bởi Thành phần phụ huynh.


0

Đây là quan điểm hiện tại của tôi về việc giải thích giữa nhà nước và đạo cụ

  1. Trạng thái giống như biến cục bộ của bạn bên trong thành phần của bạn. Bạn có thể thao tác giá trị của trạng thái bằng cách sử dụng trạng thái thiết lập. Sau đó, bạn có thể chuyển giá trị của trạng thái cho thành phần con của bạn.

  2. Đạo cụ là giá trị nằm chính xác bên trong cửa hàng redux của bạn, điều này thực sự đến từ trạng thái có nguồn gốc từ bộ giảm tốc. Thành phần của bạn nên được kết nối với redux để lấy giá trị từ đạo cụ. Bạn cũng có thể truyền giá trị đạo cụ cho thành phần con của bạn


0

Giải thích đơn giản là: STATE là trạng thái cục bộ của thành phần, ví dụ color = "blue" hoặc animation = true, v.v. Sử dụng this.setState để thay đổi trạng thái của thành phần. PROPS là cách các thành phần nói chuyện với nhau (gửi dữ liệu từ cha mẹ đến con) và làm cho các thành phần có thể sử dụng lại.


0

Trạng thái là dữ liệu của bạn, có thể thay đổi, bạn có thể làm bất cứ điều gì bạn cần với nó, đạo cụ chỉ đọc dữ liệu, thông thường khi bạn chuyển đạo cụ bạn đã làm việc với dữ liệu của mình và bạn cần thành phần con để kết xuất dữ liệu hoặc nếu đạo cụ của bạn là Hàm u gọi nó để thực hiện một nhiệm vụ


0

Nhà nước là nguồn gốc của sự thật, nơi dữ liệu của bạn sống. Bạn có thể nói nhà nước thể hiện chính nó thông qua các đạo cụ.

Cung cấp đạo cụ cho các thành phần là những gì giữ cho UI của bạn đồng bộ với dữ liệu của bạn. Một thành phần thực sự chỉ là một chức năng trả về đánh dấu.

Với cùng một đạo cụ (dữ liệu để nó hiển thị), nó sẽ luôn tạo ra cùng một đánh dấu .

Vì vậy, các đạo cụ giống như các đường ống dẫn dữ liệu từ nguồn gốc đến các thành phần chức năng.


0

Đạo cụ: đại diện cho dữ liệu "chỉ đọc", không thay đổi và tham chiếu đến các thuộc tính từ thành phần cha mẹ.

Trạng thái: biểu thị dữ liệu có thể thay đổi, cuối cùng ảnh hưởng đến nội dung được hiển thị trên trang và được quản lý bởi nội bộ bởi chính thành phần đó và thay đổi thường xuyên theo thời gian do đầu vào của Người dùng.


1
chỉ có 1 pro? và 1 con?
Sách Zeus

0

Sự khác biệt chính là trạng thái là riêng tư đối với một thành phần và chỉ có thể được thay đổi bên trong thành phần đó trong khi các đạo cụ chỉ là giá trị tĩnh và khóa cho thành phần con được truyền qua thành phần cha mẹ và không thể thay đổi bên trong thành phần con

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.