+4

Áp dụng React với Laravel (Phần 2) - Dựng React cho ưng dụng

Cài đặt môi trường

Sau bài 1 ta đã dựng xong việc lấy DB thông qua laravel, ở bài này ta tiếp tục làm việc dựng React trong Laravel. Để cài đặt các thư viện cũng như các thứ liên quan đến React trong Laravel rất đơn giản, ta chỉ việc chạy lệnh sau: php artisan preset react Đây là cách cài đặt nhanh nhất, Khi chạy lệnh này sẽ tự động thêm các version mới nhất của React bao gồm cả (React-dom và React-router). Tiếp đến sẽ tự động xóa mặc định Vue trong file resource/assets/app.js đồng thời thêm 1 Ví dụ cho phần React trong resources/assets/Compoment/Example.js Như vậy sau khi chạy lệnh kia xong ta cần chạy việc cài đặt cũng như build file js ra public bằng lệnh sau npm install && npm run dev

Chạy thử React

Để chạy thử ta sửa file resources/assets/app.js bằng cách thêm dòng sau

import Post from './components/Post';

Theo như dòng như này ta cần phải thêm 1 file Post.js ở trong folder components. Và trong file đó ta thêm như sau

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
 
/* An example React component */
class Post extends Component {
    render() {
   /* Some css code has been removed for brevity */
    return (
        <h2> All Posts </h2>
    );
  }
}
 
export default Post;
 
/* The if statement is required so as to Render the component on pages that have a div with an ID of "root";  
*/
 
if (document.getElementById('root')) {
    ReactDOM.render(<Post />, document.getElementById('root'));
}

Tiếp đến ta sửa ở file welcome.blade.php bằng thêm đoạn gọi js sau

<script src="{{ asset('js/app.js') }}" defer></script>

Và ta cần thêm 1 div có id = "root" để React có thể nhận biết vị trí fill data vào. Sau đó ta gõ vào trình duyệt link của project ta có kết quả như sau là được

Giờ ở màn hình ban đầu sẽ là danh sách các bài Post như vậy trong file Post.js ta cần khai báo 1 state là posts. Ban đầu ta thử thêm 1 vài dữ liệu demo.

    constructor() {
        super();
        //Initialize the state in the constructor
        this.state = {
            posts: [
                {id: 1, title: 'Title 1'},
                {id: 2, title: 'Tieu de 2'},
                {id: 3, title: 'Kiem tra title'},
                {id: 4, title: 'Noi dung kiem thu'},
                {id: 5, title: 'Test thu xem'},
            ],
        }
    }

Tiếp đến ta viết 1 hàm để show ra từng post một như sau:

    renderPosts() {
        return this.state.posts.map(post => {
            return {
                <li key={post.id} >
                    { post.title } 
                </li>      
            );
        })
    }

Cuối cùng ta sửa nó trong phần render trả về như sau:

    render() {
    return (
        <div>
            <h2>All Posts</h2>
            <ul>
                { this.renderPosts() }
            </ul> 
        </div> 
    );

Sau khi chạy lệnh npm run dev và gõ link trình duyệt ta có kết quả như sau là được:

Gọi dữ liệu từ API đưa vào React

Giờ tiếp theo ta cần maping data gọi từ API ở phần 1 vào list. Đầu tiên ta cần xóa sạch post ta đã thử, sau đó dùng fetch để gọi API và fill data vào posts như khai báo ở trên.

    //Hàm này sẽ được gọi trước khi render
    componentDidMount() {
        fetch('/api/posts')
            .then(response => {
                return response.json();
            })
            .then(data => {
                //Vì api ta trả về có post trong data do vậy cần phải gọi data.data
                this.setState({ posts:data.data });
            });
    }
 

Để chỉnh sửa cho đẹp hơn ta thêm các class cho giao diện như ở file home.blade.php

    <div id="root" class="col-12"></div>

Và phần render cho danh sách post ta thêm class như sau

    render() {
    return (
        <div>
            <h2>All Posts</h2>
            <div className="col-4">
                <ul>
                    { this.renderPosts() }
                </ul> 
            </div>
        </div> 

    );

Sau đó chạy npm run dev và kết quả ta có như sau:

Hiển thị chi tiết bài Post

Đầu tiên ta tạo 1 định nghĩa Post bằng file PostDetail mục đích hiển thị chi tiết Post như sau

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
const PostDetail = ({post}) => {
  if(!post) {
    return(<div >  Post Doesnt exist </div>);
  }
     
  return(  
    <div> 
      <h2> {post.title} </h2>
      <p> {post.content} </p>
      
    </div>
  )
}

export default PostDetail;

Sau đó trong file Post.js ta cần khai báo 1 state là post được chọn và khi click vào thi gọi PostDetail vừa tạo như sau

import PostDetail from './PostDetail';
    renderPosts() {
        return this.state.posts.map(post => {
            return (
                <li key={post.id} onClick={
                () =>this.handleClick(post)}>
                    { post.title } 
                </li>
            );
        })
    }

    handleClick(post) {
        this.setState({currentPost: post})
    }
    render() {
   /* Some css code has been removed for brevity */
    return (
        <div>
            <h2>All Posts</h2>
            <div className="col-4">
                <ul>
                    { this.renderPosts() }
                </ul> 
            </div>
            <div className="col-8">
                <PostDetail post={this.state.currentPost} />
            </div>
        </div> 
        );
      }

Như vậy ta xử lý thêm được phần hiển thị chi tiết


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.