รายละเอียดสำหรับเรียนรู้ React ปี 2020-2023 โดยโค้ชพล ดูหลักสูตรได้ที่ https://www.nextflow.in.th/react-training
React Component ทั่วไป จะไม่มีการเชื่อมกับระบบ Redux ตั้งแต่แรก แต่เราสามารถจับมันมาตั้งค่าให้ใช้งานกับ Redux ได้
เราเรียก Component พวกนี้ว่า Redux Container หรือ Component Container ครับ
เริ่มจาก src/pages/home-page/NoteInputBox.js
เรา import module ชื่อ connect
เข้ามาก่อน
// ใช้ snippet 'redux' ได้
import { connect } from "react-redux";
จากนั้นเราจะย้าย export default
จากที่ใช้กับ Class ของเรา ไปใช้กับส่วนอื่น
export default class NoteInputBox extends Component {
// เป็น
class NoteInputBox extends Component {
ซึ่งเราจะมาเขียนในส่วนด้านล่างแทน
เป็น
// snippet 'reduxmap'
const mapStateToProps = (state) => ({
})
const mapDispatchToProps = {
}
export default connect(mapStateToProps, mapDispatchToProps)(NoteInputBox)
src/pages/home-page/NoteInputBox.js
import React, { Component } from 'react'
import { Form, Input, Button, Card } from 'antd';
import { connect } from 'react-redux'
class NoteInputBox extends Component {
render() {
return (
<Card>
<Form>
<Form.Item layout="inline" label="Message">
<Input
placeholder="message"
/>
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">
Save
</Button>
</Form.Item>
</Form>
</Card>
)
}
}
const mapStateToProps = (state) => ({
})
const mapDispatchToProps = {
}
export default connect(mapStateToProps, mapDispatchToProps)(NoteInputBox)
ในที่นี้เราสามารถใช้ Action ที่เราสร้างขึ้น ส่ง object เข้า Redux Store ผ่าน การกำหนด function ให้กับ props ผ่าน mapDispatchToProps
ได้แบบด้านล่าง
// import action ที่เขียนไว้เข้ามาก่อน
import Actions from '../../redux/actions'
// การนั้น return object ที่กำหนด function ไปเรียกใช้คำสั่ง 'dispatch' ซึ่งจะเป็นคนส่ง action object เข้า Redux store
const mapDispatchToProps = (dispatch) => {
return {
saveNote: (message) => dispatch(Actions.saveNewNote(message))
}
}
เราจะเขียน function ให้ทำงานหลังจากที่ Form ถูก submit แล้ว
handleSubmit = e => {
e.preventDefault();
const message = this.props.form.getFieldValue('message');
console.log(message);
}
และเราในส่วนของ render()
เราจะเขียนใหม่ดังนี้
render() {
const { getFieldDecorator } = this.props.form;
return (
<Card>
<Form onSubmit={this.handleSubmit}>
<Form.Item >
{getFieldDecorator('message', {
rules: [{ required: true, message: 'Please input your message!' }],
})(
<Input
placeholder="message"
/>,
)}
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">
Save
</Button>
</Form.Item>
</Form>
</Card>
)
}
getFieldDecorator
เพื่อกำหนด Validation rule และตั้งชื่อ form field ว่า messageconst { getFieldDecorator } = this.props.form;
onSubmit
ให้กับ <Form>
<Form onSubmit={this.handleSubmit}>
<Form.Input>
ของเรา<Form.Item >
{getFieldDecorator('message', {
rules: [{ required: true, message: 'Please input your message!' }],
})(
<Input
placeholder="message"
/>,
)}
</Form.Item>
NoteInputBox = Form.create({})(NoteInputBox);
export default connect(mapStateToProps, mapDispatchToProps)(NoteInputBox)
handleSubmit = e => {
e.preventDefault();
const message = this.props.form.getFieldValue('message')
console.log(message);
this.props.saveNote(message);
}
src/pages/home-page/NoteInputBox.js
import React, { Component } from 'react'
import { Form, Input, Button, Card } from 'antd';
import { connect } from 'react-redux'
import Actions from '../../redux/actions'
class NoteInputBox extends Component {
handleSubmit = e => {
e.preventDefault();
const message = this.props.form.getFieldValue('message')
console.log(message);
this.props.saveNote(message);
}
render() {
const { getFieldDecorator } = this.props.form;
return (
<Card>
<Form onSubmit={this.handleSubmit}>
<Form.Item >
{getFieldDecorator('message', {
rules: [{ required: true, message: 'Please input your message!' }],
})(
<Input
placeholder="message"
/>,
)}
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">
Save
</Button>
</Form.Item>
</Form>
</Card>
)
}
}
const mapStateToProps = (state) => ({
})
const mapDispatchToProps = (dispatch) => {
return {
saveNote: (message) => dispatch(Actions.saveNewNote(message))
}
}
NoteInputBox = Form.create({})(NoteInputBox);
export default connect(mapStateToProps, mapDispatchToProps)(NoteInputBox)