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

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

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

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

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

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>

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

Үйл явц нэмэх хичээлд хуудасны Гарчиг өөрчлөх товч дээр дарахад үүсэх үйл явцын боловсруулагчийг үүсгэн туршин үзсэн. Үйл явцын боловсруулагч changeTitleHandler функц консолд Товч дарагдсан текстийг л харуулж байгаа. Энэ удаадд үйл явцын боловсруулагчийн функционал ажиллагаа буюу h1 гарчигаар үзүүлж байгаа текстийг өөрчлөлтийг хийе. changeTitleHandler функцэд h1 гарчигаар үзүүлж байгаа текстийг

  changeTitleHandler = () => {
    console.log("Товч дарагдсан")
    this.state.pageTitle = "Товч дарагдсан"
  }

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

Сүүлийн жилүүдэд Angular, React, Vue гэх мэт Javascript сангуудын хөгжлөөр интернет програмчлалд динамик ажиллагаагтай сайт боловсруулах шинэ давалгаа үүссэн. Энэ нийтлэлээр Angular гэж юу вэ, юунд хэрэгтэй, ямар асуудлыг шийдэхэд бидэнд туслахыг тодруулъя. Angular бол Google компани боловсруулсан нээлттэй эх код бүхий JavaScript сан буюу фреймворк. Angular фреймворкийг ашиглан Single page application / нэг хуудас програм/ гэж нэрлэдэг динамик програмыг бүтээдэг. Энгийнээр хэлбэл Single page application гэдэг нь интернет дэх ердийн сайт боловч сайт ердөө нэг л хуудсаас бүрдэнэ. Энэ бол техникийн талаасаа ойлголт. Single page application хэрхэн ажилладаг, ердийн сайтуудаас ямар давуу талтайг Angular -ын албан ёсны веб сайтаас https://angular.io харж болно.

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

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас хооронд динамик буюу дахин ачаалахгүйгээр шилжилт хийх боломжийг бүрдүүлсэн. App компонентийн кодод бүртгүүлсэн

function App() {
  return (
    <div>
      <nav className="nav">
        <ul>
          <li>
            <Link to="/">Нүүр</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
        </ul>
      </nav>

      <hr />
      <Routes>
        <Route path="/" element={<Cars />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </div>
  );
}

export default App;

/ чиглүүлэгч манай нүүр хуудас буюу http://localhost:3000/ хаягийг зааж байгаа ч Cars компонентод шилжиж байгаа нь логикийн талаасаа ойлгомж муутай болсон. Иймээс кодийг / чиглүүлэгчээр нүүр хуудаст шилждэг болгоё.

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

тэгшитгэлийн нэг язгуур нь эерэг, нөгөө язгуур нь сөрөг байх параметрийн бүх утгыг ол.
Тэнцэтгэл бишийн нэг шийд нь M -ээс бага нөгөө шийд нь M -ээс их байх гарцаагүй ба хүрэлцээтэй нөхцөлийг ашиглавал болох бөгөөд энэ тэнцэтгэл бишийг бодвол үед манай тэнцэтгэл бишийн шийдийн нэг нь эерэг нөгөө нь сөрөг байна.

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

 

функц [1;9] завсарын аль хэсэгт буурах вэ?

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

 

функцийн хамгийн бага утгыг ол.

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