Үр дүнгийн боловсруулалт

Хичээлээр Үр дүнгийн компонент хичээлээр хийсэн компонентод динамик ажиллагааг хэрэгжүүлве. Өөрөөр хэлбэл сорилгын үр дүнг динамикаар үзүүлэх юм. Үүний тулд Quiz компонентод

const [results, setResults] = useState({})

сорилгын үр дүнгийн results төлвийг нэмэн өгье. results обьект үр дүнг {[асуултын_id]: хариултын_төлөв} хэлбэрээр агуулна. Өөрөөр хэлбэл хариултын төлөв талбарт хариулт зөв бол right буруу бол wrong утгыг агуулах юм.

Обьектод асуулт бүрээр элемент үүсэх ёстой учраас хэрэглэгчийн сонгосон хариултын боловсруулалтыг хийх onAnswerClickHandler аргад results төлвийг

  const onAnswerClickHandler = (answerId) => {
    if (quiz[activeQuestion].rightAnswerId === answerId) {
      if (!results[quiz[activeQuestion].id]) {
        setResults(prev => { return{...prev, [quiz[activeQuestion].id]: "right" }})
      }
      setAnswerState({ [answerId]: "right" })
      const timeout = window.setTimeout(() => {
        if (isQuizFinished()) {
          setIsFinished(true)
        } else {
          setAnswerState(null)
          setActiveQuestion(activeQuestion + 1)      
        }
        window.clearTimeout(timeout);
      }, 1000);
    } else {
      setResults(prev => { return{...prev, [quiz[activeQuestion].id]: "wrong" }})
      setAnswerState({ [answerId]: "wrong" })
    }
  };

бүрдүүлэх логикийг нэмэн оруулъя. Асуултад буруу хариулсан бол setResults функцээр results обьектод тухайн асуултын id -тай wrong утгатай элементийг үүсгэнэ. Харин асуултад зөв хариулсан бол results обьектод тухайн асуултын id -тай элемент байхгүй буюу хэрэглэгч эхний сонголтоор зөв хариултыг өгсөн бол results обьектод тухайн асуултын id -тай right утгатай элементийг үүсгэнэ. Эсрэг тохиолдол буюу хэрэглэгч буруу хариултыг сонговол results обьектод тухайн асуултын id -тай элемент үүссэн бол өөрчлөлт хийгдэхгүй. setResults функц обьекттой ажиллах онцлогын талаар useState хук хичээлд дурдсанг эргэн харахыг зөвлөе.
Асуулт бүрээр results обьектод элемент үүсэх тул сорилго дуусахад түүнийг QuizResult компонентод

      <div className={classes.QuizWrapper}>
        <h3>Асуултуудад хариулна уу</h3>
        {isFinished ? (
          <QuizResult results={results} quiz={quiz}/>
        ) : (
          <ActiveQuiz
    ...
          />
        )}
      </div>

дамжуулна. Үүний зэрэгцээ QuizResult компонент сорилгын асуултуудыг харуулах учраас quiz параметрээр асуултын массивийг бас дамжуулъя. Одоо сорилгын үр дүнг үзүүлэх QuizResult компонентийн кодийг

const QuizResult = (props) => {
  return (
    <div className={classes.QuizResult}>
      <ul>
        {props.quiz.map((quizItem, index) => {
          const cls = [
            "fa",
            props.results[quizItem.id] === "wrong" ? "fa-times" : "fa-check",
            classes[props.results[quizItem.id]],
          ];
          return (
            <li key={index}>
              <strong>{index + 1}</strong>. &nbsp;
              {quizItem.question}
              <i className={cls.join(" ")} />
            </li>
          );
        })}
      </ul>
      <p>12 асуултаас 4 -ыг зөв хариуллаа.</p>
      <div>
        <button>Дахин эхлэх</button>
      </div>
    </div>
  )
}

гэж өөрчилье. QuizResult компонентод ирэх quiz параметрийг map функцээр итерац хийн асуултуудыг quizItem -д аван li тегээр харуулж байгаа. key={index} атрибут яагаад орж ирэх ёстойг Хариултын хувилбарууд хичээлээс мэднэ. map функц алхам бүрдээ quizItem -аар асуултыг өгөх тул түүний question талбарт асуулт байгаа гэдэг нь тодорхой. Хэрэглэгч асуултад зөв эсхүл буруу хариулсанг бид icon фонтоор үзүүлэхээр төлөвлөсөн тул icon фонтийн хэвжүүлэлтийг QuizResult компонентод ирсэн results параметрээр зохицуулна. Үүний тулд классийн cls массивийг үүсгээд түүнд классийн нэрүүдийг элемент байдлаар тодорхойлсон. icon фонт fa класстай байх ёстой. icon -ий нэр results параметрийн утгаас хамааран өөрчлөгдөх тул тухайн алхамын quizItem -ийн id талбарт тохирох results параметрийн утга буруу буюу wrong байвал fa-times эсрэг тохиолдолд fa-check фонтийн нэрийг өгнө. Үүнээс гадна cls массивийн гуравдах элементээр quizItem -ийн id талбарт тохирох results параметрийн утганд тохирох classes массивийн элементийг фонтийн өнгөөр өгнө. Эцэст нь i тегд cls массивийн join аргаар элементүүдийг хоосон зайгаар тусгаарлагдсан мөр болгон className атрибутад өгнө. Өөрлөлтийг хадгалаад сорилгыг ажлуулан үр дүнг харвал

r_06_09_01

гэж харагдана. Сорилгын асуултуудад хариулахдаа эхний асуултыг буруу харин хоёрдахь асуултыг эхний оролдлогоор зөв хариулсан үр дүн болохыг сануулъя. Та боломжит хувилбаруудаар шалган үзээрэй. Асуултын хариултын боловсруулалтыг динамик болголоо. Одоо хичнээн асуултаас хэдийг зөв хариулсанг QuizResult компонентод

const QuizResult = (props) => {
  const rightCount = Object.keys(props.results).reduce((total, key) => {
    if (props.results[key] === "right") {
      total++;
    }
    return total;
  }, 0);  
  return (
    <div className={classes.QuizResult}>
      ...
      <p>{props.quiz.length} асуултаас {rightCount} -ыг зөв хариуллаа.</p>
      <div>
        <button>Дахин эхлэх</button>
      </div>
    </div>
  )
}

гэж динамик болгоё. QuizResult компонентод quiz параметрээр асуултууд ирж байгаа учраас нийт асуултын тоог props.quiz.length буюу quiz массивийн уртаар амархан тодорхойлно. Зөв хариултын тоог results параметрээс тооцохдоо rightCount хувьсагчийг үүсгэсэн. results обьект учраас Object классийн keys аргаар results обьектийг түлхүүр, утга хэлбэрийн массивт хөрвүүлээд массивийн reduce аргаар зөв хариултын тоог тооцсон. reduce аргад эхний параметрээр эргэн дуудалтын /callback/ функцийг хоёрдахь параметрээр үр дүнгийн буюу зөв хариултын эхний утгыг дамжуулсан. callback функцэд итераци бүрд зөв хариултыг тоолох total болон тухайн алхам дахь элементийн туүлхүүр key -г дамжуулна. Функцэд results -ийн key -д харгалзах элемент right утгатай бол total -ийг нэгээр нэмэгдүүлээд дараагийн алхамд хариултыг тоолох total -ийн эхний утга болгон буцаана. Ингэснээр хэрэглэгчийн зөв хариулсан асуултын тоог rightCount хувьсагчид олгоод түүнийг jsx -д оруулан өгнө.

Санамж: react өөрөө javascript сан тул бид javascript -ийн бүхий л боломжуудыг ашиглаж болно. Иймээс массивийн reduce арга гэлтгүй javascript -ийн хэлний боломжуудыг дэлгэрүүлэн судлахыг зөвлөе.  

Өөрчлөлтийг хадгалаад сорилгын ажлуулбал

r_06_09_02

үр дүнг авна. Хэрэглэгч хичнээн асуултаас хэдийг зөв хариулсанг динамикаар үзүүллээ. QuizResult компонентийн Дахин эхлэх товчийг ажиллагаатай болгоё. Товч дээр дарахад дуудагдах функц Quiz компонентоос QuizResult компонентод пропсоор дамжин ирэх тул

      <div>
        <button onClick={props.onRetry}>Дахин эхлэх</button>
      </div>

Дахин эхлэх товчинд onClick үйл явцын боловсруулагчийг тавиад props.onRetry утгыг өгье.

Санамж: react санг судалж эхлэж байгаа хүмүүст компонент хооронд параметр дамжуулж байгаа ажиллагаанууд ойлгомжгүй болоод төвөгтэй мэт санагдаж байж магадгүй. Олон параметрийг /пропс/ компонентуудаар дамжуулан шидэх нь зарим нэгэн талаар төвөгтэй нь үнэн хэдий ч эхлээд яг энэ аргачлалаар компонент хоорондын уялдан ажиллагааг ойлгох нь илүү байх болов уу. Сангийн ерөнхий ажиллагааны схемийг ойлгосоны дараа параметрүүдийг компонентуудаар дамжуулан шийдэхгүйгээр ашиглах context цаашлаад redux, mobx гэх мэтийн сангуудыг ашиглаж сурахыг зөвлөе.

onRetry функц QuizResult компонентод пропсоор ирнэ. Тэгвэл Quiz компонентоос QuizResult компонентийг дуудахдаа түүнд

          <QuizResult 
            results={results}
            quiz={quiz}
            onRetry={retryHandler}  
          />

onRetry атрибутаар retryHandler функцийг дамжуулъя. Quiz компонентод retryHandler функцийг

  const retryHandler = () => {
    setActiveQuestion(0)      
    setAnswerState(null)
    setIsFinished(false)
    setResults({})
  }

гэж хэрэгжүүлэн өгье. Контекстийг алдахгүйн тулд retryHandler функцийг сумаар тодорхойлон өгнө. Сорилгын дахин эхлүүлэхийн тулд функцэд Quiz компонентийн шаардлагатай төлвүүдийг анхдагч утгатай болгох хэрэгтэй тул тохирох set функцуудаар сорилгын үед динамикаар утгууд авч байгаа төлвүүдийн анхдагч утгуудыг сэргээн олгосон. Өөрчлөлтийг хадгалаад сорилгыг дахин эхлүүлэн туршин үзээрэй.

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

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

react програмд олон хуудас үүсгэн удирдахын тулд react -ийн бүрэлдхүүнд ордоггүй ч түүнтэй нягт холбоотой ажилладаг нэмэлт пакетийг суулгах хэрэгтэй. Үүний тулд VSCode -ийн терминалийн цонхыг нээгээд

npm i react-router-dom

командыг өгнө. Пакетийг facebook боловсруулаагүй ч react програмд олон хуудас үүсгэн удирдахад хамгийн өргөнөөр ашигладаг. Төсөлд пакетийг ашиглахын тулд төслийн кодийг тусгай компонентод багцлан react програмд react-router пакетийг ашиглаж байгааг мэдэгдэх юм.

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

Хичээлээр Vue CLI гэж юу болох, юунд ашиглах, яагаад мэдэх хэрэгтэй тухай авч үзье. Vue CLI бол VueJS төслийг маш хурдан, эвтэйхэн байдлаар үүсгэн ашиглахад зориулагдсан хэрэгсэл. Бид өмнөх хичээлүүдэд html файлд VueJS санг оруулаад түүнийг ашиглаж болж байхад VueJS дээр бүтэн төсөл үүсгэх ямар шаардлагатай гэж бодож байж болно.

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

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

r_06_05_02

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

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

Энэ хичээлээс RxJs санг өгөгдөлтэй ажиллах ажиллагааг маш эвтэйхэн болгосон операторуудын талаар авч үзэж эхлэнэ. Өмнөх хичээлүүдэд бид төрөл бүрийн промис, массив, мөр, тоо, үйл явц гэх мэтийн өгөгдлүүдээс Observable /ажиглагч/ классын хувиудыг хэрхэн үүсгэхийг үзэцгээсэн. Энэ хичээлээс өмнөх хичээлүүдэд сурч авсан мэдлэгтээ суурилан RxJs санг ашиглан төрөл бүрийн өгөгдлүүдийг яаж удирдан, өөрчлөх операторуудтай танилцах болно. Энэ хичээлд map, pluck гэдэг хоёр сонирхолтой операторыг үзнэ.

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

Хуваах нь нэг тоо нөгөө тоонд хэдэн удаа агуулагдаж буй тодорхойлох арифметикийн үйлдэл.
Хуваалтыг нэг бус удаа…

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

 

Зуучлагч (Mediator) нь олон тооны обьектууд бие биетэйгээ холбоос үүсгэхгүйгээр харилцан ажиллах боломжийг хангах загварчлалын хэв юм. Ингэснээр…

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

 

Делегатууд хичээлд ухагдхууны талаар дэлгэрэнгүй үзсэн ч жишээнүүд делегатийн хүчийг бүрэн харуулж чадахааргүй байсан.…

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

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

Адил хажуут трапецын сууриуд 20 ба 12 см. Трапецыг багтаасан тойргийн төв их суурь дээр байрлах бол трапецын диагналыг ол.

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

 

тэгшитгэлийн язгууруудын нийлбэрийг ол.

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

 

Зурагт үзүүлсэн хагас тойрогт бол AB -ийн уртыг ол.

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