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

Хукууд ердийн функцууд тул бид ч өөрсдөө хукийг зохион ашиглах боломжтой. Үүнийг 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 -ийг цэвэрлэнэ.
Ийм байдлаар бид маш олон функционалтай өөрсдийн хукийг үүсгэн ашиглах боломжтой.

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

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

  Нээгдсэн тоо: 537 Нийтийн

React 16.8 хувилбараас компонентийг Component классаас удамшуулахгүйгээр энгийн функц хэлбэрээр буюу функционал компонентийг бичих боломж бий болсон.
React компонентийн ажиллагааны үндэс бол төлвийн удирдлагад оршдог. Өөрөөр хэлбэл компонентийн төлвийг тодорхойлсон обьектийн аль нэгэн эсхүл бүхэлд нь өөрчлөлт ороход React энэ төлвөөс хамааралтай дэлгэцийн хэсгийг дахин зурдаг. Бид өмнөх хичээлүүдэд ашиглаж байсан Component классаас удамшсан компонентийн төлвийг өөрчлөхдөө this.setState({ pageTitle: newTitle }) гэх байдлаар setState аргыг ашиглаж байсан.

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

Обьектыг үүсгэх

String обьект нь энгийн тэмдэгтийн төрөлд харгалзах хэлний дотоод обьект юм. Обьект мөрийг шалгах, хэсгийг таслан авах, том жижиг үсгэнд шилжүүлэх гээд олон тооны аргуудтай. Энэ хичээлээр бид String обьектын ихээр хэрэглэдэг аргуудын талаар авч үзэх болно. String() конструктур нь анхны утгыг заан өгөх заавал байх шаардлагагүй параметртэй. Обьектыг үүсгэх жишээнүүд

var s = new String();
var head1 = new String("JavaScript хичээлүүд");

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

VueJs фреймворкийн үндсэн ухагдхууныг танилцуулах ээлжит хичээлээр директивүүдийн тэмдэглэгээний талаар авч үзье. VueJs -ийн тодорхой директивүүдтэй илүү эвтэйхэн ажиллах боломжийг доорх код бүхий хуудас дээр харцгаая.

    <body>
        <div id="app">
            <h2>
                <a v-bind:href="url">E-surgalt</a>
            </h2>
            <h2>
                Тоолуур = {{ counter }}
            </h2>

            <button v-on:click="counter++">Нэмэгдүүлэх</button>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            new Vue({
                el: '#app',
                data: {
                    url: 'https:',
                    counter: 0
                }
            })
        </script>
    </body>

  Нээгдсэн тоо: 937 Нийтийн

Хэрэглэгч талын хуудасны элементүүдийг удирдах бас нэгэн арга бол v-if директивийг ашиглах юм. Хуудас дахь элементүүдийг удирдах ажиллагааг хөнгөн эвтэйхэн хийдэг нь раектив фреймворкуудын нэг давуу тал бөгөөд хичээлээр v-if директивийн ажиллагааны онцлогийг

    <body>
        <div id="app">
            <h1 v-if="isVisible">Гарчиг 1</h1>
            <h2 v-else style="color: red">Гарчиг 2</h2>
            <hr>
            <button @click="isVisible = !isVisible">Сэлгэгч</button>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            new Vue({
                el: '#app',
                data: {
                    isVisible: true
                }
            })
        </script>        
    </body>

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

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

Хоёр тойрог гадна талаараа шүргэлцсэн. Нэг тойргийн шүргэгч нь нөгөө тойргийнхоо төвийг дайран гарсан. Шүргэлтийн цэгээс хоёрдахь тойргийн төв хүртэлх зай нь энэ тойргийн радиусаас 3 дахин урт. Нэгдүгээр тойргийн урт хоёрдугаар тойргийн уртаас хэд дахин их вэ?

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

 

тэгшитгэлийг бод.

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

 

бол илэрхийллийн утгыг ол.

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