Hướng dẫn react props html element

Về cơ bản, JSX chỉ cung cấp cú pháp đặc biệt cho hàm React.createElement(component, props, ...children). Đoạn mã JSX:

<MyButton color="blue" shadowSize={2}>
  Click Me
MyButton>

được biên dịch thành:

React.createElement(
  MyButton,
  {color: 'blue', shadowSize: 2},
  'Click Me'
)

Bạn cũng có thể sử dụng dạng thẻ tự đóng(self-closing) nếu không có children. Do vậy:

<div className="sidebar" />

được biên dịch thành:

React.createElement(
  'div',
  {className: 'sidebar'}
)

Nếu bạn muốn kiểm tra xem cách mà JSX được chuyển đổi sang JavaScript, bạn có thể thử the online Babel compiler.

Chỉ Định Kiểu React Element

Phần đầu tiên của một thẻ JSX xác định kiểu của React element.

Các kiểu viết hoa thể hiện rằng thẻ JSX đang ám chỉ tới một React component. Những thẻ này được biên dịch thành một tham chiếu trực tiếp đến biến được đặt tên, do vậy nếu bạn sử dụng biểu thức JSX , Foo phải nằm trong scope.

React Phải Nằm trong Scope

Vì JSX đuợc biên dịch thành lời gọi tới React.createElement, nên thư viện React phải luôn nằm trong scope mã JSX của bạn.

Ví dụ, cả hai import đều cần thiết trong đoạn mã này, mặc dù ReactCustomButton không được tham chiếu trực tiếp từ JavaScript:

import React from 'react';import CustomButton from './CustomButton';
function WarningButton() {
  // return React.createElement(CustomButton, {color: 'red'}, null);  return <CustomButton color="red" />;
}

Nếu bạn không sử dụng một trình đóng gói JavaScript(JavaScript bundler) và tải React từ một thẻ

import React from 'react';

// Sai! Đây là một component và nên được viết hoa:function hello(props) {  // Chính xác! Sử dụng 
là hợp lệ vì div là một thẻ HTML: return <div>Hello {props.toWhat}div>; } function HelloWorld() { // Sai! React nghĩ là một thẻ HTML vì nó không được viết hoa chữ cái đầu: return <hello toWhat="World" />;}

Để khắc phục vấn đề này, chúng tôi sẽ đổi tên hello thành Hello và sử dụng khi tham chiếu đến nó:

import React from 'react';

// Chính xác! Đây là một component và nên được viết hoa:function Hello(props) {  // Chính xác! Sử dụng 
là hợp lệ vì div là một thẻ HTML: return <div>Hello {props.toWhat}div>; } function HelloWorld() { // Chính xác! React biết là một component vì nó được viết hoa. return <Hello toWhat="World" />;}

Chọn Kiểu tại Thời Điểm Thực Thi

Bạn không thể sử dụng một biểu thức tổng hợp để làm một kiểu React element. Nếu bạn muốn sử dụng một biểu thức tổng hợp để thể hiện kiểu của element, chỉ cần gán nó cho một biến được viết hoa trước. Vấn đề này thường xuất hiện khi bạn muốn render một component khác dựa trên một prop:

import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
  photo: PhotoStory,
  video: VideoStory
};

function Story(props) {
  // Sai! JSX type không thể là một biểu thức.  return <components[props.storyType] story={props.story} />;}

Để khắc phục vấn đề này, chúng tôi sẽ gán kiểu cho một biến được viết hoa trước:

import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
  photo: PhotoStory,
  video: VideoStory
};

function Story(props) {
  // Chính xác! JSX type có thể là một biến được viết hoa.  const SpecificStory = components[props.storyType];  return <SpecificStory story={props.story} />;}

Props trong JSX

Có vài cách khác nhau để chỉ định props trong JSX.

Biểu thức JavaScript làm Props

Bạn có thể truyền bất kỳ biểu thức JavaScript nào làm prop, bằng cách bao quanh nó với {}. Ví dụ, trong đoạn mã JSX bên dưới:

<MyComponent foo={1 + 2 + 3 + 4} />

Đối với MyComponent, giá trị của props.foo sẽ là 10 vì biểu thức 1 + 2 + 3 + 4 đã được tính toán.

Câu lệnh if và vòng lặp for không phải là biểu thức trong JavaScript, do vậy chúng không thể được sử dụng trong JSX một cách trực tiếp. Thay vào đó, bạn có thể đặt chúng ở đoạn mã xung quanh. Ví dụ:

function NumberDescriber(props) {
  let description;
  if (props.number % 2 == 0) {    description = <strong>evenstrong>;  } else {    description = <i>oddi>;  }  return <div>{props.number} is an {description} numberdiv>;
}

Bạn có thể tìm hiểu thêm về render có điều kiện vầ vòng lặp ở những mục tương ứng.

String Literals

Bạn có thể truyền một string literal làm một prop. Hai biểu thức JSX bên dưới là tương đương:

<MyComponent message="hello world" />

<MyComponent message={'hello world'} />

Khi bạn truyền một string literal, giá trị của nó là HTML-unescaped. Do vậy hai biểu thức JSX bên dưới là tương đương:

<MyComponent message="<3" />

<MyComponent message={'<3'} />

Hành vi này thường không phù hợp. Nó chỉ được đề cập ở đây cho đầy đủ.

Props Mặc Định là “True”

Nếu bạn không truyền giá trị cho một prop, nó sẽ được mặc định là true. Hai biểu thức JSX bên dưới là tương đương:

<MyTextBox autocomplete />

<MyTextBox autocomplete={true} />

Nhìn chung, chúng tôi không khuyến khích việc không truyền giá trị cho một prop, vì nó có thể gây nhầm lẫn với ES6 object shorthand {foo} là viết tắt của {foo: foo} thay vì {foo: true}. Hành vi này tồn tại để phù hợp với hành vi của HTML.

Spread Attributes

Nếu bạn đã có một props là một object, và bạn muốn truyền nó trong JSX, bạn có thể sử dụng ... như một toán tử “spread” để truyền toàn bộ props object. Hai component bên dưới là tương đương:

function App1() {
  return <Greeting firstName="Ben" lastName="Hector" />;
}

function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;}

Bạn cũng có thể chọn một vài props mà component của bạn sẽ sử dụng trong khi truyền toàn bộ những props còn lại sử dụng toán tử spread.

const Button = props => {
  const { kind, ...other } = props;  const className = kind === "primary" ? "PrimaryButton" : "SecondaryButton";
  return <button className={className} {...other} />;
};

const App = () => {
  return (
    <div>
      <Button kind="primary" onClick={() => console.log("clicked!")}>
        Hello World!
      Button>
    div>
  );
};

Ở ví dụ bên trên, kind prop được sử dụng một cách an toàn và không bị truyền tới