React Context API và các Higher-order Components

Công Nghệ
React Context API và các Higher-order Components
Tác giả: Shems Eddine Có thể bạn đã gặp qua React’s Context API mà không nhận ra nó, nó tương tự với High-Order-Components. Nếu bạn đã từng làm việc với Redux, bạn sẽ có kinh nghiệm cả hai, React’s Context API và High-Order-Component, {connect} từ gói react-redux của họ. Hoặc @material-ui/core với withStyles . Cả hai khái niệm này đều không khó nhưng tôi nghĩ việc nhận ra khi sử dụng chúng mới khó khăn. Trong ứng dụng tôi đang làm việc, tôi đã có một đối tượng client được sử dụng để lưu trữ các giá trị mặc định và cài đặt mặc định của hệ thống cũng như các đối tượng có thể tái sử dụng ( ứng dụng tôi xây dựng cũng có khái niệm về một middlware để các đối tượng trong đó có thể thay đổi dựa trên middlewares injected ). Script Chúng tôi sẽ làm việc trên “theme” cho ứng dụng của chúng tôi. Chúng tôi có một đối tượng lưu trữ chủ đề mặc định của chúng tôi mà các trang của chúng tôi có thể sử dụng. Kịch bản này có thể được xây dựng hoàn toàn với React’s Context API. Context API Hãy bắt đầu bằng cách tạo một tệp có tên ThemeContext.js . import React from 'react'; export default React.createContext(); Trong mục nhập của ứng dụng của chúng tôi, chúng tôi muốn phần renders của chúng tôi như sau: import React from 'react'; import ThemeContext from './ThemeContext'; const App = () => { return ( <ThemeContext.Provider value="dark"> <Welcome /> </ThemeContext.Provider> ) } ReactDOM.render(<App />, document.getElementById("root")); Và trong Welcome component: import React from 'react'; import ThemeContext from './ThemeContext'; const Welcome = () => { <ThemeContext.Consumer> {theme => { return ( <div style={{background: theme === "dark" ? "#000" : "#fff"}}> <h2 style={{color:...

Tác giả: Shems Eddine

Có thể bạn đã gặp qua React’s Context API mà không nhận ra nó, nó tương tự với High-Order-Components.

Nếu bạn đã từng làm việc với Redux, bạn sẽ có kinh nghiệm cả hai, React’s Context API và High-Order-Component, {connect} từ gói react-redux của họ. Hoặc @material-ui/core với withStyles.

Cả hai khái niệm này đều không khó nhưng tôi nghĩ việc nhận ra khi sử dụng chúng mới khó khăn.

Trong ứng dụng tôi đang làm việc, tôi đã có một đối tượng client được sử dụng để lưu trữ các giá trị mặc định và cài đặt mặc định của hệ thống cũng như các đối tượng có thể tái sử dụng (ứng dụng tôi xây dựng cũng có khái niệm về một middlware để các đối tượng trong đó có thể thay đổi dựa trên middlewares injected).

Script

Chúng tôi sẽ làm việc trên “theme” cho ứng dụng của chúng tôi. Chúng tôi có một đối tượng lưu trữ chủ đề mặc định của chúng tôi mà các trang của chúng tôi có thể sử dụng.

Kịch bản này có thể được xây dựng hoàn toàn với React’s Context API.

Context API

Hãy bắt đầu bằng cách tạo một tệp có tên ThemeContext.js.

import React from 'react';
export default React.createContext();

Trong mục nhập của ứng dụng của chúng tôi, chúng tôi muốn phần renders của chúng tôi như sau:

import React from 'react';
import ThemeContext from './ThemeContext';
const App = () => {
return (
    <ThemeContext.Provider value="dark">
      <Welcome />
    </ThemeContext.Provider>
  )
}
ReactDOM.render(<App />, document.getElementById("root"));

Và trong Welcome component:

import React from 'react';
import ThemeContext from './ThemeContext';
const Welcome = () => {
  <ThemeContext.Consumer>
    {theme => {
      return (
        <div style={{background: theme === "dark" ? "#000" : "#fff"}}>
          <h2 style={{color: theme !== "dark" ? "#000" : "#fff"}}>Welcome</h2>
        </div>
      )
    }}
  </ThemeContext.Consumer>
}
export default Welcome;

Điều này thể hiện sự đơn giản của React’s Context API. Trước tiên, chúng tôi đã xác định React’s Context API của mình. Chúng tôi xác định các Provider trong thành phần ứng dụng của chúng tôi ở đây vì điều này sẽ đảm bảo rằng context được cung cấp cho tất cả các component con khi cần thiết.

Tôi nghĩ rằng đó là điều bạn nên biết, nếu Provider không được xác định cao hơn consumer, thì bạn sẽ không bao giờ có thể nhận được các giá trị từ bên trong.

Tiếp theo, chúng tôi xác định consumer của mình, ở đây chúng tôi có thể truy cập context value theme mà chúng tôi có thể sử dụng để tùy chỉnh các component của chúng tôi.

Ví dụ này không khó về mặt kỹ thuật và bạn có thể thoát ra chỉ bằng cách chuyển sang chủ đề như là biện pháp phòng ngừa trong trường hợp này. Tuy nhiên, bạn cần phải tưởng tượng rằng trong một ứng dụng lớn, bạn có thể có hàng tá component cần thiết để truy cập vào giá trị này một cách khác nhau.

Higher-Order Components

Cá nhân tôi ghét cú pháp được sử dụng để sử dụng API Context Consumer và nó có thể mang lại sự mệt mỏi. Ngoài ra nếu theme object của tôi phức tạp, tôi có thể không cần tất cả các giá trị từ nó vì vậy tôi muốn có khả năng lựa chọn khi tôi cần chúng.

Giả sử theme object của tôi trông giống như sau:

const theme = {
  background: {
      color: {
    primary: "#f00",
    secondary: "#f0f"
   }
 }
...// more items here
};

Nếu tôi cần truy cập bất cứ thứ gì ở đây, các component của tôi sẽ bắt đầu trở nên thực sự lộn xộn. Điều gì làm cho nó tồi tệ hơn là nếu bạn có một Context khác mà bạn đang cố truy cập. Sự lồng ghép này sẽ trở nên khủng khiếp.

Vì vậy, hãy tạo Higher-Order Component.

import React from "react";
import ThemeContext from "./ThemeContext";
const defaultMergeProps = (themeProps) => ({
  ...themeProps
});
export const connect = (mergeProps = defaultMergeProps) => ComponentToWrap => {
  return class ClientComponent extends React.Component {
    render() {
      return (
        <ThemeContext.Consumer>
          {theme => {
            const props = {...mergeProps({ theme }), ...this.props};
            return <ComponentToWrap {...props} />;
          }}
        </ThemeContext.Consumer>
      );
    }
  };
};
export default connect;

Ở đây, chúng tôi đang tạo HOC của chúng tôi, được gọi là connect. Điều này có một hàm để chuyển đổi các thuộc tính được truyền vào component của chúng ta. Điều này cũng trả về một hàm có trong component của chúng ta và đưa các thuộc tính vào nó.

Hãy chia nhỏ thêm một chút nữa.

Chúng tôi có function defaultMergeProps có trong theme props. Function mặc định là chỉ trả về các giá trị của theme object.

Bây giờ bạn có thể thấy rằng trong hàm trả về, chúng ta sử dụng Context API (our ThemeContext) consumer và truyền vào theme object xuống hàm mergeProps. Điều này cho phép chúng tôi tùy chỉnh cách chúng tôi sử dụng để giải nén các

import React from 'react';
import { connect } from './connect';
const Welcome = ({primaryBackground, primaryText}) => {
  return (
    <div style={{background: primaryBackground}}>
      <h2 style={{color: primaryText}}>Welcome</h2>
    </div>
  )
}
const mergeProps = (theme) => (
  {
    primaryBackground: theme.background.primary, 
    primaryText: theme.text.color.primary
    }
);
export default connect(mergeProps)(Welcome);

Như bạn có thể thấy, thành phần chính nó là nhiều neater. Chúng tôi giải nén các thuộc tính chúng tôi cần từ các theme props và đưa chúng vào component của chúng tôi giống như chúng là các thuộc tính thông thường.

Như bạn có thể thấy, hai mô hình này có lợi thế nhưng tôi sẽ không đi lung tung. Nhiều khả năng, bạn sẽ không cần phải làm việc với nó và nhu cầu của bạn có thể được đáp ứng với các gói như Redux. Nhưng nếu bạn định làm điều đó, việc áp dụng hai mẫu chắc chắn sẽ giúp giữ cho các component của bạn đơn giản và rõ ràng hơn để đọc.

Provider

Nếu bạn đang phát triển gói này được các nhóm khác sử dụng và có khả năng tạo nhiều dự án, tôi cũng sẽ tạo một Provider component riêng biệt liên quan đến Context Provider thực tế, theme này sẽ một là tính năng.

import React from "react";
import ThemeContext from "./ThemeContext";
export default class Provider extends React.Component {
  render() {
    return (
      <ThemeContext.Provider value={this.props.theme}>
        {this.props.children}
      </ThemeContext.Provider>
    );
  }
}

Và trong file App.js, chúng tôi có thể ẩn việc thực hiện căn bản với việc sử dụng Provider này.

import React from 'react';
import Provider from './Provider';
const App = () => {
  let theme = {...};
  return (
    <Provider theme={theme}>
      <Welcome />
    </Provider>
  )
}
ReactDOM.render(<App />, document.getElementById("root"));

Tham khảo các vị trí tuyển dụng React hấp dẫn tại đây

Bài viết gốc được đăng tải tại Medium

Bài viết liên quan

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bài viết được sự cho phép của tác giả Chung Nguyễn Hôm nay, nhóm Laravel đã phát hành một phiên bản chính mới của “ laravel/installer ” bao gồm hỗ trợ khởi động nhanh các dự án Jetstream. Với phiên bản mới này khi bạn chạy laravel new project-name , bạn sẽ nhận được các tùy chọn Jetstream. Ví dụ: API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth Cách sử dụng Laravel với Socket.IO laravel new foo --jet --dev Sau đó, nó sẽ hỏi bạn thích stack Jetstream nào hơn: Which Jetstream stack do you prefer? [0] Livewire [1] inertia > livewire Will your application use teams? (yes/no) [no]: ... Nếu bạn đã cài bộ Laravel Installer, để nâng cấp lên phiên bản mới bạn chạy lệnh: composer global update Một số trường hợp cập nhật bị thất bại, bạn hãy thử, gỡ đi và cài đặt lại nha composer global remove laravel/installer composer global require laravel/installer Bài viết gốc được đăng tải tại chungnguyen.xyz Có thể bạn quan tâm: Cài đặt Laravel Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server? Quản lý các Laravel route gọn hơn và dễ dàng hơn Xem thêm Tuyển dụng lập trình Laravel hấp dẫn trên Station D

By stationd
Principle thiết kế của các sản phẩm nổi tiếng

Principle thiết kế của các sản phẩm nổi tiếng

Tác giả: Lưu Bình An Phù hợp cho các bạn thiết kế nào ko muốn làm code dạo, design dạo nữa, bạn muốn cái gì đó cao hơn ở tầng khái niệm Nếu lập trình chúng ta có các nguyên tắc chung khi viết code như KISS , DRY , thì trong thiết kế cũng có những nguyên tắc chính khi làm việc. Những nguyên tắc này sẽ là kim chỉ nam, nếu có tranh cãi giữa các member trong team, thì cứ đè nguyên tắc này ra mà giải quyết (nghe hơi có mùi cứng nhắc, mình thì thích tùy cơ ứng biến hơn) Tìm các vị trí tuyển dụng designer lương cao cho bạn Nguyên tắc thiết kế của GOV.UK Đây là danh sách của trang GOV.UK Bắt đầu với thứ user cần Làm ít hơn Thiết kế với dữ liệu Làm mọi thứ thật dễ dàng Lặp. Rồi lặp lại lần nữa Dành cho tất cả mọi người Hiểu ngữ cảnh hiện tại Làm dịch vụ digital, không phải làm website Nhất quán, nhưng không hòa tan (phải có chất riêng với thằng khác) Cởi mở, mọi thứ tốt hơn Bao trừu tượng luôn các bạn, trang Gov.uk này cũng có câu tổng quát rất hay Thiết kế tốt là thiết kế có thể sử dụng. Phục vụ cho nhiều đối tượng sử dụng, dễ đọc nhất nhất có thể. Nếu phải từ bỏ đẹp tinh tế – thì cứ bỏ luôn . Chúng ta tạo sản phẩm cho nhu cầu sử dụng, không phải cho người hâm mộ . Chúng ta thiết kế để cả nước sử dụng, không phải những người đã từng sử dụng web. Những người cần dịch vụ của chúng ta nhất là những người đang cảm thấy khó sử dụng dịch...

By stationd
Hiểu về trình duyệt – How browsers work

Hiểu về trình duyệt – How browsers work

Bài viết được sự cho phép của vntesters.com Khi nhìn từ bên ngoài, trình duyệt web giống như một ứng dụng hiển thị những thông tin và tài nguyên từ server lên màn hình người sử dụng, nhưng để làm được công việc hiển thị đó đòi hỏi trình duyệt phải xử lý rất nhiều thông tin và nhiều tầng phía bên dưới. Việc chúng ta (Developers, Testers) tìm hiểu càng sâu tầng bên dưới để nắm được nguyên tắc hoạt động và xử lý của trình duyệt sẽ rất hữu ích trong công việc viết code, sử dụng các tài nguyên cũng như kiểm thử ứng dụng của mình. Cách để npm packages chạy trong browser Câu hỏi phỏng vấn mẹo về React: Component hay element được render trong browser? Khi hiểu được cách thức hoạt động của trình duyệt chúng ta có thể trả lời được rất nhiều câu hỏi như: Tại sao cùng một trang web lại hiển thị khác nhau trên hai trình duyệt? Tại sao chức năng này đang chạy tốt trên trình duyệt Firefox nhưng qua trình duyệt khác lại bị lỗi? Làm sao để trang web hiển thị nội dung nhanh và tối ưu hơn một chút?… Hy vọng sau bài này sẽ giúp các bạn có một cái nhìn rõ hơn cũng như giúp ích được trong công việc hiện tại. 1. Cấu trúc của một trình duyệt Trước tiên chúng ta đi qua cấu trúc, thành phần chung và cơ bản nhất của một trình duyệt web hiện đại, nó sẽ gồm các thành phần (tầng) như sau: Thành phần nằm phía trên là những thành phần gần với tương tác của người dùng, càng phía dưới thì càng sâu và nặng về xử lý dữ liệu hơn tương tác. Nhiệm...

By stationd
Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Lĩnh vực EdTech (ứng dụng công nghệ vào các sản phẩm giáo dục) trên toàn cầu hiện nay đã tương đối phong phú với nhiều tên tuổi lớn phân phối đều trên các hạng mục như Broad Online Learning Platforms (nền tảng cung cấp khóa học online đại chúng – tiêu biểu như Coursera, Udemy, KhanAcademy,…) Learning Management Systems (hệ thống quản lý lớp học – tiêu biểu như Schoology, Edmodo, ClassDojo,…) Next-Gen Study Tools (công cụ hỗ trợ học tập – tiểu biểu như Kahoot!, Lumosity, Curriculet,…) Tech Learning (đào tạo công nghệ – tiêu biểu như Udacity, Codecademy, PluralSight,…), Enterprise Learning (đào tạo trong doanh nghiệp – tiêu biểu như Edcast, ExecOnline, Grovo,..),… Hiện nay thị trường EdTech tại Việt Nam đã đón nhận khoảng đầu tư khoảng 55 triệu đô cho lĩnh vực này nhiều đơn vị nước ngoài đang quan tâm mạnh đến thị trường này ngày càng nhiều hơn. Là một trong những xu hướng phát triển tốt, và có doanh nghiệp đã hoạt động khá lâu trong ngành nêu tại infographic như Topica, nhưng EdTech vẫn chỉ đang trong giai đoạn sơ khai tại Việt Nam. Tại Việt Nam, hệ sinh thái EdTech trong nước vẫn còn rất non trẻ và thiếu vắng nhiều tên tuổi trong các hạng mục như Enterprise Learning (mới chỉ có MANA), School Administration (hệ thống quản lý trường học) hay Search (tìm kiếm, so sánh trường và khóa học),… Với chỉ dưới 5% số dân công sở có sử dụng một trong các dịch vụ giáo dục online, EdTech cho thấy vẫn còn một thị trường rộng lớn đang chờ được khai phá. *** Vừa qua Station D đã công bố Báo cáo Vietnam IT Landscape 2019 đem đến cái nhìn toàn cảnh về các ứng dụng công...

By stationd