- vừa được xem lúc

React context API (Part 2) — Updating state through a Consumer

0 0 8

Người đăng: Dang Van

Theo Viblo Asia

Ở phần 1 chúng ta đã tìm hiểu và tận dụng context trong React để pass state values đến các component con(child component) (Part 1). Và ở phần 2 này chúng ta sẽ cùng tìm hiểu cách update state từ Consumer.

Create the context

Cùng tạo lại 1 file Context.js như part 1 nào :V

const { Provider, Consumer } = createContext()

The Parent

Okay, vậy giờ là tạo Parent.js và init state sample

state = { toggleGrandChild: false, toggleName: false, people: [ { id: 0, name: “Bob”, age: 24 }, { id: 1, name: “Jack”, age: 22 }, { id: 2, name: “Jill”, age: 26 }, ],
}

item toggleGrandChild có nhiệm vụ toggled GrandChild hoặc không :v. hihi và default của nó sẽ là false.

Để làm được điều đó ta tạo 1 func:

toggleComponent = () => { this.setState({ toggleGrandChild: !this.state.toggleGrandChild, })
}

func này đơn giản chỉ là thay đổi state của item toggleGrandChild về giá trị ngược lại với giá trị hiện tại thooi ?

switchNameHandler = newName => { this.setState({ toggleName: !this.state.toggleName, people: [ { id: 0, name: newName, age: 24 }, { id: 1, name: “Jack”, age: 22 }, { id: 2, name: “Jill”, age: 26 }, ], })
}

còn func này để thay đổi giá trị name của people đầu tiên trong list, và update state của item toggleName. Đơn giản thôi, tẹo nữa bạn sẽ biết nó được dùng như thế nào.

The Provider

ôn tập: Provider phải wrap components chứa Consumer

<Provider value={{ state: this.state, toggleComponent: this.toggleComponent, switchNameHandler: e => this.switchNameHandler(e) }}> <Child />
</Provider>

Ở đây, vì muốn truyền 1 function vào trong context Cusomer thì ta sẽ phải viết kiểu cấu trúc như trên

switchNameHandler: e => this.switchNameHandler(e) (biến chứa func)

The Child component

Context sẽ có cấu trúc context => (...). Các items trong Cusomer sẽ tương ứng với từng value được truyền từ Provider

Note: context là 1 tên tùy biến bạn có thể đặt 1 tên khác nhé không cứ phải là context đâu

<Consumer> {context => ( <div> <h1>Child Component</h1> {context.state.people.map(person => { return ( <p key={person.id}> Hi, I am {person.name} and I am {person.age} years old. </p> ) })} <button onClick={() => context.toggleComponent()}> Toggle Component </button> {context.state.toggleGrandChild ? <GrandChild /> : null} </div> )}
</Consumer>

Việc đầu tiên là map qua từn phần tử people từ Provider. Parent component ta có set state: this.state cho nên ở Child compnent ta có thể dụng context.state.people

context.state.toggleGrandChild ? <GrandChild /> : null

Một cách viết ngắn gọn hơn so với

if context.state.toggleGrandChild === true { <GrandChild />
} else { null
}

The GrandChild coponent

Đơn giản là show ra 1 cái gì đó.

<Consumer> {context => ( <div> <h1>GrandChild Component</h1> {context.state.people.map(person => { return ( <p key={person.id}> Hi, I am {person.name} and I am {person.age} years old. </p> ); })} </div> )} </Consumer>

Như vậy ta sẽ có một demo đơn giản là click và button toggle sẽ update state của toggleGrandChild -> state được câp nhật và GrandChild sẽ được show/hide dựa vào state hiện tại của toggleGrandChild.

Vậy bạn có thắc mắc func switchNameHandler để làm gì không, chỉ là để thêm 1 vài chức năng demo nữa thôi :v

Sử dụng cũng đơn giản thôi, vì ta đã truyền func theo variable switchNameHandler nên ta chi cần xử lý như sau

Thêm button để excute vào GrandChild coponent

<button onClick={ context.state.toggleName ? e => context.switchNameHandler("John") : e => context.switchNameHandler("Roger") }> Toggle Name
</button>

Kết quả

Vậy là demo của chúng ta đã làm màu thêm được xíu ?, qua bài viết các bạn sẽ hiểu thêm được một chút về context

Nguồn

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cùng tìm hiểu về các hook trong React hooks

Đối với ai đã từng làm việc với React thì chắc hẳn đã có những lúc cảm thấy bối rối không biết nên dùng stateless (functional) component hay là stateful component. Nếu có dùng stateful component thì cũng sẽ phải loay hoay với đống LifeCycle 1 cách khổ sở Rất may là những nhà phát triển React đã kịp

0 0 83

- vừa được xem lúc

Khi nào nên (và không nên) sử dụng Redux

. Công việc quản lý state với những hệ thống lớn và phức tạp là một điều khá khó khăn cho đến khi Redux xuất hiện. Lấy cảm hứng từ design pattern Flux, Redux được thiết kế để quản lý state trong các project JavaScript.

0 0 109

- vừa được xem lúc

ReactJS: Props và State

Nếu bạn đã học ReactJS hay React Native, bạn sẽ thấy các Props và State được sử dụng rất nhiều. Vậy chính xác chúng là gì? Làm thế nào để chúng ta sử dụng chúng đúng mục đích đây.

0 0 45

- vừa được xem lúc

State và Props trong Reactjs

Hello các bạn, tiếp tục seri tìm hiểu về ReactJs hôm nay mình xin giới thiệu đến các bạn hai thứ mình cho là thú vị nhất của ReactJs là State và Props. State bạn có thể hiểu đơn giản là một nơi mà bạn lưu trữ dữ liệu của Component, từ đó bạn có thể luân chuyển dữ liệu đến các thành phần trong Compon

0 0 39

- vừa được xem lúc

Memoization trong React

. 1.Introduction. Memoization có liên quan mật thiết đến bộ nhớ đệm, và dưới đây là một ví dụ đơn giản:. const cache = {}.

0 0 40

- vừa được xem lúc

Nâng cao hiệu suất React Hooks với React.memo, Memoization và Callback Functions

1.Ngăn Re-render và React.memo. React.

0 0 69