Өөрийн хук зохиох

Хукууд ердийн функцууд тул бид ч өөрсдөө хукийг зохион ашиглах боломжтой. Үүнийг input элемент, түүнд оруулсан текстийг үзүүлэх h1 гарчиг бүхий дараах энгийн

import React, {useState} from 'react'

function App() {
  const [name, setName] = useState('')
 
  const changeHandler = event => {
    setName(event.target.value)  
  }
 
  return (
    <div className="container pt-3">
      <input type="text" value={name} onChange={changeHandler}/>
      <h1>{name}</h1>
    </div>      
  );
}

export default App;

жишээгээр харцгаая.

input элемент useState -тэй харилцан ажиллах болно. Өөрөөр хэлбэл input -д өөрчлөлт ороход changeHandler функц ажиллан name төлвийн утгыг input -д оруулсан утгаар өөрчлөөд байна гэсэн үг. useState -ээр input элементтэй зөв харилцан ажилахын тулд input элементийн value атрибутад name хувьсагчийг олгох хэрэгтэй. Програмийн компиляцийг хийвэл хөтөч дээр input элемент бүхий хуудасыг нээх бөгөөд input -д утга оруулбал

r_10_08_01

түүнийг h1 гарчигаар үзүүлнэ. Хуудасны ажиллагаанаас input -ийн өөрчлөлтийг ямар нэгэн асуудалгүй хэвийн боловсруулж байгаа нь харагдана. Асуудал хуудас хэд хэдэн input элементийг агуулах үед бий болно. Жишээ нь манай хуудаст нэрээс гадна овог гэх мэтээр шинэ input -ууд нэмэгдвэл кодод

function App() {
  const [name, setName] = useState('')
  const [lastName, setLastName] = useState('')
 
  const changeHandler = event => {
    setName(event.target.value)  
  }
 
  const LastNameHandler = event => {
    setLastName(event.target.value)
  }
 
  return (
    <div className="container pt-3">
      <input type="text" value={lastName} onChange={LastNameHandler} className="mx-3"/>
      <input type="text" value={name} onChange={changeHandler}/>
      <hr />
      <h1>{lastName} {name}</h1>
    </div>      
  );
}

шинээр input , төлөвүүд, үйл явцын боловсруулагч гээд нэг ижил төрлийн кодууд нэмэгдэх болно. Үүнд зарим нэгэн оптимизацийг /сайжруулалт/ хийж болох нь ойлгомжтой ч бид өөрсдийн хукийг үүсгэн асуудлыг хэрхэн шийдэхийг

import React, {useEffect, useState} from 'react'

function useLogger(value) {
  useEffect( () => {
    console.log('Value changed: ', value)
  }, [value])
}

function App() {
  const [name, setName] = useState('')
 
  const changeHandler = event => {
    setName(event.target.value)  
  }
 
  useLogger(name)
 
  return (
    <div className="container pt-3">
      <input type="text" value={name} onChange={changeHandler}/>
      <hr />
      <h1>{name}</h1>
    </div>      
  );
}

харцгаая. Кодод нэг input элементийг үлдээгээд useLogger функцийг үүсгэн өгье. useLogger функц бол манай хук учраас нэрийг use угтвартай өгсөн. useLogger функц тодорхой хувьсагчийн өөрчлөлтийг ажиглах үүрэгтэй учраас параметрээр хувьсагчийг авах ёстой. Өөрийн хукийг зохиохдоо react -ийн үндсэн хукуудыг ашигладаг онцлогтой. Манай useLogger функц ямар нэгэн хувьсагчийн өөрчлөлтийг ажиглаж байхын тулд useEffect хукийг ашигласан. Функцийн useEffect хук консолд value -ийг өөрчлөлтийг үзүүлнэ. useLogger функц бол зохиомол хукийн суурь код юм. useLogger хукийг App компонентод useLogger(name) гэж ашиглая. Хуудасны ажиллагааг шалгавал

r_10_08_02

name хувьсагчийн өөрчлөлт бүрд консолд түүний утгыг үзүүлнэ. Одоо input -ийн асуудлыг хэрхэн шийдэхийг

...

function useInput(initialValue) {
  const [value, setValue] = useState(initialValue)
 
  const onChange = event => {
    setValue(event.target.value)  
  }
 
  return {
    value, onChange
  }
}

function App() {
  const input = useInput('')
 
  useLogger(input.value)
 
  return (
    <div className="container pt-3">
      <input type="text" value={input.value} onChange={input.onChange}/>
      <hr />
      <h1>{input.value}</h1>
    </div>      
  );
}
...

кодоос харцгаая. Энд useInput шинэ хук буюу функцийг нэмсэн. Функцийг input -д ашиглах тул элементийн ахндагч утгыг initialValue параметрээр дамжуулъя. Цааш useInput функцэд useState хукаар локал /дотоод/ төлвийг үүсгэхдээ initialValue параметрээр ирсэн утгыг төлвийн анхдагч утгаар өгнө. Функцээс input -д ашиглагдах атрибут, функцууд гээд олон зүйлийг буцааж болох ч App компонентийн input -д хэрэглэгдэх зүйлээр хязгаарлан өгсөн. Өөрөөр хэлбэл App компонентийн input -д ашиглагдаж буй атрибут, функцийг useInput функцээс буцаасан. Reactinput бол html тег биш элемент бөгөөд энэ элемент value, onChange параметрүүдийг авна гэдгээс useInput функц value, onChange талбаруудтай обьектийг буцааж байгаа хэрэг. ES6 -д обьектийн талбар, түүний утгыг агуулж буй хувьсагчид ижил бол обьектийг ганц нэрээр тодорхойлж болдогийг ES6 -гийн өөрчлөлтүүд хичээлийн багцаас мэднэ.

Жиш: React санг судлахын өмнө Javascript хэлийг сайн судлан ойлгосон байх хэрэгтэй шүү.  

useInput функц App компонентийн input -ийн логикийг өөртөө агуулсан тул App компонентоос input -ийн төлөвтэй холбоотой / useState, changeHandler / хэсгийг хассан байгаа. Дээрх кодод input -д хэрэглэх суурь хукийн кодийг л харуулж байгаа. App компонентод useInput хукийг useInput('') гэж анхдагч утгыг дамжуулан дуудаад буцаах обьектийг input хувьсагчид авна. Цааш useLogger, input, h1 -үүдэд input обьектийн тохирох талбаруудыг ашиглах ёстой.
Хуудасны ажиллагааг шалгавал бүх зүйл хэвийн ажиллана. Туршаад үзээрэй.
useInput функцээс буцаах обьектийн талбарууд App компонентийн input -ийн атрибутуудын нэртэй ижилхэн буюу давхцаж байгаа тул

...
function App() {
  const input = useInput('')
 
  useLogger(input.value)
 
  return (
    <div className="container pt-3">
      <input type="text" {... input}/>
      <hr />
      <h1>{input.value}</h1>
    </div>      
  );
}
...

javascript -ийн spread операторийг ашиглан {... input} бичлэгээр сольж болно. Одоо App компонент олон input -тэй жишээ нь овог, нэр гэх мэтээр болох тохиолдолд

...
function App() {
  const lastName = useInput('')
  const name = useInput('')
 
  return (
    <div className="container pt-3">
      <input type="text" {... lastName}/>
      <input type="text" {... name}/>
      <hr />
      <h1>{lastName.value} {name.value}</h1>
    </div>      
  );
}
...

гэж ямар нэгэн илүү зүйлгүйгээр шийдэх боломжтой.
useInput функцээс обьект буцааж байгаа тул логикийг илүү өргөжүүлж болно. Жишээ нь useInput хукд input -ийг

...
function useInput(initialValue) {
  const [value, setValue] = useState(initialValue)
 
  const onChange = event => {
    setValue(event.target.value)  
  }
 
  const clear = () => {
    setValue('')
  }
 
  return {
    bind: {value, onChange},
    value,
    clear
  }
}
...

цэвэрлэх clear функцийг нэмэн өгөөд буцаах обьектоор дамжуулъя. Функцээс буцааж буй обьектод input -тэй холбоотой атрибут, функцийг тусд нь bind обьектод оруулсан. Энэ нь App компонентийн input элементэд ямар нэгэн илүү шинжүүд дамжуулахгүй санаа. Хэрвээ input элементэд түүнд хамаагүй жишээ нь clear шинжийг дамжуулбал react компонентийн jsx кодийн генераци хийхдээ алдаа заах болно. useInput хукаас буцаах обьектийг App компонентод

function App() {
  const name = useInput('')
 
  return (
    <div className="container pt-3">
      <input type="text" {... name.bind}/>
      <button className="btn btn-warning" onClick = {() => name.clear()}>Цэвэрлэх</button>
      <hr />
      <h1> {name.value}</h1>
    </div>      
  );
}

гэж ашиглая. input элементийн шинжээр name.bind обьектийг өгөөд clear функцийг Цэвэрлэх товч дээр даралт хийхэд дуудагдахаар оруулан өгсөн байгаа. Програмийн ажиллагааг шалган үзвэл

r_10_08_03

ажиллагаанууд өмнөхтэй ижил ч Цэвэрлэх товчийг дарвал input -ийг цэвэрлэнэ.
Ийм байдлаар бид маш олон функционалтай өөрсдийн хукийг үүсгэн ашиглах боломжтой.

Зөвлөмж: Сайтын нийтийн болон бүртгэлтэй төлөвтэй хичээлүүдээс тухайн сэдвийн талаар л тодорхой ойлготыг авч болох боломжтой. Хичээлийн жишээ нь өмнөх хичээлүүдийн жишээн дээр суурилсан тул та санг боломжийн хэмжээнд эзэмшсэн байж хичээлийн кодийг ойлгох болно. Санг бүрэн хэмжээнд судлахыг хүсвэл та тусгай эрх тусгай эрх нээлгэхийг зөвлөе.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 401 Төлбөртэй

Асуултын хариултыг үзүүлэх компонентийг Хариултын хувилбарууд хичээлээр хэрэгжүүлэхдээ Quiz компонентийн quiz массивт зөвхөн хариулт хэсгийг тодорхойлоод асуултыг ActiveQuiz компонентод статик байдлаар тавин өгсөн байгаа. Одоо сорилгын төлвийн quiz массивийг бүрэн хэмжээний болгох ажиллагааг хийцгээе. quiz массивт асуултыг оруулая. quiz массивт асуултууд обьектуудийн массив хэлбэрээр тодорхойлогдож байгаа тул

  const [quiz, setQuiz] = useState(
    [      
      {
        question: "Дэлхийд хэдэн улс байдаг вэ?",
        answers: [
          { text: "210", id: 1 },
          { text: "190", id: 2 },
          { text: "250", id: 3 },
          { text: "180", id: 4 },
        ],        
      }
    ])

quiz массивийн обьектод question талбарыг нэмээд түүнд асуултыг оруулсан.

  Нээгдсэн тоо: 351 Бүртгүүлэх

Хичээлээр react -ийн хамгийн чухал бөгөөд хэрэгтэй хукуудийн нэг болох useCallback -ийн талаар авч үзье. Хукийн судалгааг дараах

import React, {useState} from 'react'

function App() {
  const [colored, setColored] = useState(false)
  const [count, setCount] = useState(1)
    
  const styles = {
      color: colored ? 'darkred' : 'black'
  }
    
  return (
      <div className="container">
        <h1 style={styles}>Элементийн тоо: {count}</h1>
        <button className={'btn btn-success mx-3'} onClick={() => setCount(prev => prev + 1)}>Нэмэх</button>
        <button className={'btn btn-warning mx-3'} onClick={() => setColored(prev => !prev)}>Өөрчлөх</button>
      </div>
  );
}

export default App;

кодоор авч үзье. Компонентийн код логикийн хувьд өмнөх хичээлүүдийнхтэй бараг ижил тул тайлбарлах нь илүүц гэж үзлээ.

  Нээгдсэн тоо: 348 Бүртгүүлэх

Өмнөх Хулганы товч даралтын боловсруулалт хичээлд асуулт, түүний хариултуудын хувилбарууд, зөв хариултын дугаар зэргийг quiz массивт тодорхойлон өгснөөр манай төслийн сорилго явуулах хуудас

r_06_05_02

байдлаар харагдах болсон.

  Нээгдсэн тоо: 783 Төлбөртэй

ES6 -д бий болсон модулийн системийн дүрмийн талаар үзэхийн өмнө зарим бэлтгэл ажлыг хийх хэрэгтэй. Төслийн үндсэн хавтаст extra.js файлыг үүсгээд дараах кодыг

let name = 'e-surgalt.com';
let age = 6;

оруулан өгье. extra.js файлд зарлагдсан хоёр хувьсагчийг index.js файлд оруулан ирэх хэрэг гарлаа гэе. Энд хоёр нөхцлийг хангана. Нэгд бусад модулууд extra.js файлд зарлагдсан хувьсагчдыг өөртөө ашиглах боломжийг нээх зорилгоор түүнийг гадагш экспортлох ёстой. Хоёрт бусад модулаас эскпорт хийгдсэн зүйлийг ашиглах модул нь импортлох хэрэгтэй.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

Нээгдсэн тоо : 128

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

Нээгдсэн тоо : 190

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

Нээгдсэн тоо : 158

 

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 284

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 313

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 320

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 385

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 386

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 461

 
Энэ долоо хоногт

Нээгдсэн тоо : 746

 

Аяга, стакан, ваар, лаазанд сүү, ундаа, квас, ус байжээ. Аяганд ус, сүү байхгүй, ундаатай сав ваар болон квастай савны дунд, лаазанд ундаа, усны аль нь ч байхгүй, стакан лааз ба сүүтэй савтай зэрэгцэн байрласан бол ямар саванд ямар шингэнийг хийсэн бэ.

Жич: Маш сонирхолтой гоё бодлого. Оролдоод үзээрэй.

Нээгдсэн тоо : 1074

 

илэрхийллийн хялбарчил.

Нээгдсэн тоо : 325