Rumah  >  Artikel  >  hujung hadapan web  >  Corak Reka Bentuk ReactJS: Menulis Komponen Teguh dan Boleh Skala

Corak Reka Bentuk ReactJS: Menulis Komponen Teguh dan Boleh Skala

WBOY
WBOYasal
2024-09-10 14:30:42280semak imbas

ReactJS Design Patterns: Writing Robust and Scalable Components

Corak reka bentuk dalam ReactJS menyediakan penyelesaian piawai dan terbukti kepada masalah biasa dalam pembangunan aplikasi. Menggunakan corak ini bukan sahaja menjadikan kod anda lebih mudah dibaca dan diselenggara tetapi juga meningkatkan kebolehskalaan dan keteguhannya. Mari kita selami beberapa corak reka bentuk ReactJS yang paling popular, dengan contoh untuk menggambarkan penggunaannya.

1. Corak Bekas dan Komponen Persembahan

Corak Bekas dan Persembahan memisahkan komponen kepada dua kategori:

  • Komponen Persembahan: Fokus pada rupa perkara (UI).
  • Komponen Bekas: Fokus pada cara sesuatu berfungsi (logik dan pengurusan keadaan).

Pemisahan ini membolehkan kebolehgunaan semula yang lebih baik, ujian yang lebih mudah dan kod yang lebih bersih.

Contoh: Komponen Persembahan dan Bekas

// Presentational Component: Displaying User List (UserList.js)
import React from 'react';

const UserList = ({ users }) => (
  <ul>
    {users.map((user) => (
      <li key={user.id}>{user.name}</li>
    ))}
  </ul>
);

export default UserList;
// Container Component: Fetching User Data (UserContainer.js)
import React, { useState, useEffect } from 'react';
import UserList from './UserList';

const UserContainer = () => {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    const fetchUsers = async () => {
      const response = await fetch('https://jsonplaceholder.typicode.com/users');
      const data = await response.json();
      setUsers(data);
    };
    fetchUsers();
  }, []);

  return <UserList users={users} />;
};

export default UserContainer;

Di sini, UserList ialah komponen pembentangan yang menerima pengguna sebagai prop, manakala UserContainer mengendalikan pengambilan data dan pengurusan keadaan.

2. Corak Komponen Pesanan Tinggi (HOC)

Satu Komponen Pesanan Tinggi (HOC) ialah fungsi yang mengambil komponen sebagai hujah dan mengembalikan komponen baharu. HOC biasanya digunakan untuk merentasi kebimbangan seperti pengesahan, pengelogan atau mempertingkatkan gelagat komponen.

Contoh: Membuat HOC untuk Kebenaran

// withAuthorization.js (HOC for Authorization)
import React from 'react';

const withAuthorization = (WrappedComponent) => {
  return class extends React.Component {
    componentDidMount() {
      if (!localStorage.getItem('authToken')) {
        // Redirect to login if not authenticated
        window.location.href = '/login';
      }
    }

    render() {
      return <WrappedComponent {...this.props} />;
    }
  };
};

export default withAuthorization;
// Dashboard.js (Component Wrapped with HOC)
import React from 'react';
import withAuthorization from './withAuthorization';

const Dashboard = () => <h1>Welcome to the Dashboard</h1>;

export default withAuthorization(Dashboard);

Dengan membalut Papan Pemuka dengan withAuthorization, anda memastikan bahawa hanya pengguna yang disahkan boleh mengaksesnya.

3. Corak Props Render

Corak Render Props melibatkan perkongsian kod antara komponen menggunakan prop yang nilainya ialah fungsi. Corak ini berguna untuk pemaparan dinamik berdasarkan keadaan atau keadaan tertentu.

Contoh: Menggunakan Render Props untuk Penjejakan Tetikus

// MouseTracker.js (Component with Render Props)
import React, { useState } from 'react';

const MouseTracker = ({ render }) => {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  const handleMouseMove = (event) => {
    setPosition({ x: event.clientX, y: event.clientY });
  };

  return <div onMouseMove={handleMouseMove}>{render(position)}</div>;
};

export default MouseTracker;
// App.js (Using Render Props)
import React from 'react';
import MouseTracker from './MouseTracker';

const App = () => (
  <MouseTracker
    render={({ x, y }) => (
      <h1>
        Mouse position: ({x}, {y})
      </h1>
    )}
  />
);

export default App;

Komponen MouseTracker menggunakan prop render untuk menghantar data kedudukan tetikus kepada mana-mana komponen, menjadikannya sangat boleh digunakan semula.

4. Corak Cangkuk Tersuai

Cangkuk Tersuai membolehkan anda merangkum dan menggunakan semula logik stateful merentas berbilang komponen. Corak ini menggalakkan kebolehgunaan semula kod dan pemisahan kebimbangan yang bersih.

Contoh: Mencipta Cangkuk Tersuai untuk Mengambil Data

// useFetch.js (Custom Hook)
import { useState, useEffect } from 'react';

const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      const response = await fetch(url);
      const result = await response.json();
      setData(result);
      setLoading(false);
    };
    fetchData();
  }, [url]);

  return { data, loading };
};

export default useFetch;
// App.js (Using the Custom Hook)
import React from 'react';
import useFetch from './useFetch';

const App = () => {
  const { data, loading } = useFetch('https://jsonplaceholder.typicode.com/posts');

  if (loading) return <div>Loading...</div>;

  return (
    <ul>
      {data.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};

export default App;

Kait tersuai useFetch merangkum logik pengambilan data, yang boleh digunakan semula merentas komponen yang berbeza.

5. Corak Komponen Kompaun

Corak Komponen Kompaun membolehkan komponen berfungsi bersama untuk mengurus keadaan dan tingkah laku. Corak ini berguna untuk membina komponen UI yang kompleks seperti tab, akordion atau lungsur turun.

Contoh: Membina Tab dengan Komponen Kompaun

// Tabs.js (Parent Component)
import React, { useState } from 'react';

const Tabs = ({ children }) => {
  const [activeIndex, setActiveIndex] = useState(0);

  return React.Children.map(children, (child, index) =>
    React.cloneElement(child, { isActive: index === activeIndex, setActiveIndex, index })
  );
};

const Tab = ({ children, isActive, setActiveIndex, index }) => (
  <button onClick={() => setActiveIndex(index)}>{children}</button>
);

const TabPanel = ({ children, isActive }) => (isActive ? <div>{children}</div> : null);

Tabs.Tab = Tab;
Tabs.TabPanel = TabPanel;

export default Tabs;
// App.js (Using Compound Components)
import React from 'react';
import Tabs from './Tabs';

const App = () => (
  <Tabs>
    <Tabs.Tab>Tab 1</Tabs.Tab>
    <Tabs.Tab>Tab 2</Tabs.Tab>
    <Tabs.TabPanel>Content for Tab 1</Tabs.TabPanel>
    <Tabs.TabPanel>Content for Tab 2</Tabs.TabPanel>
  </Tabs>
);

export default App;

Komponen Tab mengurus keadaan, manakala komponen Tab dan TabPanel berfungsi bersama untuk memaparkan kandungan tab.

6. Corak Komponen Terkawal dan Tidak Terkawal

Komponen terkawal diurus sepenuhnya oleh keadaan React, manakala komponen tidak terkawal bergantung pada DOM untuk keadaannya. Kedua-duanya mempunyai kegunaannya, tetapi komponen terkawal biasanya lebih disukai untuk ketekalan dan kebolehselenggaraan.

Contoh: Komponen Terkawal lwn. Tidak Terkawal

// Controlled Component (TextInputControlled.js)
import React, { useState } from 'react';

const TextInputControlled = () => {
  const [value, setValue] = useState('');

  return (
    <input type="text" value={value} onChange={(e) => setValue(e.target.value)} />
  );
};

export default TextInputControlled;
// Uncontrolled Component (TextInputUncontrolled.js)
import React, { useRef } from 'react';

const TextInputUncontrolled = () => {
  const inputRef = useRef();

  const handleClick = () => {
    console.log(inputRef.current.value);
  };

  return (
    <>
      <input type="text" ref={inputRef} />
      <button onClick={handleClick}>Log Input Value</button>
    </>
  );
};

export default TextInputUncontrolled;

Dalam komponen terkawal, React mengawal sepenuhnya keadaan borang, manakala dalam komponen tidak terkawal, keadaan diuruskan oleh DOM sendiri.

7. Corak Kilang Cangkuk

Corak Kilang Hooks melibatkan penciptaan cangkuk yang menjana dan mengurus berbilang keadaan atau gelagat secara dinamik, menyediakan cara yang fleksibel untuk mengurus logik yang kompleks.

Contoh: Pengurusan Negeri Dinamik dengan Kilang Cangkuk

// useDynamicState.js (Hook Factory)
import { useState } from 'react';

const useDynamicState = (initialStates) => {
  const states = {};
  const setters = {};

  initialStates.forEach(([key, initialValue]) => {
    const [state, setState] = useState(initialValue);
    states[key] = state;
    setters[key] = setState;
  });

  return [states, setters];
};

export default useDynamicState;
// App.js (Using the Hooks Factory)
import React from 'react';
import useDynamicState from './useDynamicState';

const App = () => {
  const [states, setters] = useDynamicState([
    ['name', ''],
    ['age', 0],
  ]);

  return (
    <div>
      <input
        type="text"
        value={states.name}
        onChange={(e) => setters

.name(e.target.value)}
      />
      <input
        type="number"
        value={states.age}
        onChange={(e) => setters.age(parseInt(e.target.value))}
      />
      <p>Name: {states.name}</p>
      <p>Age: {states.age}</p>
    </div>
  );
};

export default App;

Kilang cangkuk ini mencipta dan mengurus berbilang keadaan secara dinamik, memberikan fleksibiliti dan kod yang lebih bersih.

Kesimpulan

Dengan memanfaatkan corak reka bentuk ini, anda boleh mencipta aplikasi React yang lebih teguh, berskala dan boleh diselenggara. Corak ini membantu anda menulis kod yang bersih dan boleh diguna semula yang mematuhi amalan terbaik, memastikan aplikasi anda lebih mudah untuk dibangunkan dan diurus dari semasa ke semasa.

Adakah anda ingin menyelami lebih mendalam mana-mana corak ini atau meneroka topik lain?

Atas ialah kandungan terperinci Corak Reka Bentuk ReactJS: Menulis Komponen Teguh dan Boleh Skala. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Tugasan SelamatArtikel seterusnya:Tugasan Selamat