{"id":2086,"date":"2021-06-21T11:49:10","date_gmt":"2021-06-21T11:49:10","guid":{"rendered":"https:\/\/lvboard.infostore.in.ua\/?p=2086"},"modified":"2021-06-21T11:49:10","modified_gmt":"2021-06-21T11:49:10","slug":"%d0%bf%d0%b8%d1%88%d0%b8-%d0%bd%d0%b0-react-%d0%b2-%d0%b4%d0%b2%d0%b0-%d1%80%d0%b0%d0%b7%d0%b0-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b5%d0%b5","status":"publish","type":"post","link":"https:\/\/lvboard.infostore.in.ua\/?p=2086","title":{"rendered":"\u041f\u0438\u0448\u0438 \u043d\u0430 React \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435"},"content":{"rendered":"\n<p><strong>\u0412\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430! \u041f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u2013 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443!<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043a\u0440\u0435\u043f\u043a\u043e \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0439 \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435.&nbsp;<a href=\"https:\/\/medium.com\/@housecor\/designing-reusable-react-components-1cbeb897b048\" target=\"_blank\" rel=\"noreferrer noopener\">\u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437 \u00ab\u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u043e\u0432 Lego\u00bb<\/a>&nbsp;\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0441 \u043d\u0443\u043b\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u043d\u043e\u043b\u0438\u0442.<\/p>\n\n\n\n<p>\u0422\u0430\u043a \u0431\u0440\u043e\u0441\u0438\u043c \u0436\u0435 \u0432\u0441\u0435 \u0441\u0438\u043b\u044b \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043c\u044b\u0441\u043b\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435!<\/p>\n\n\n\n<h2>\u0423\u0447\u0438\u043c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/h2>\n\n\n\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0436\u0443\u043d \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443\u043c\u0435\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0447\u0435\u043c\u0443 \u0442\u0443\u0442 \u0443\u0447\u0438\u0442\u044c\u0441\u044f? \u041d\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0440\u043e\u0437\u043d\u044c, \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445.&nbsp;\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0440\u043e\u0434\u0435 \u0432\u0430\u0441, \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0441\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u043e\u0440\u043e\u043d. \u0410 \u0437\u0430\u0442\u0435\u043c&nbsp;<a href=\"https:\/\/medium.com\/free-code-camp\/mindset-lessons-from-a-year-with-react-1de862421981#3bb9\" target=\"_blank\" rel=\"noreferrer noopener\">\u043c\u043d\u043e\u0433\u043e-\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043c<\/a>, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0440\u0438\u043b\u043b\u0438\u0430\u043d\u0442.<\/p>\n\n\n\n<p>\u0411\u0443\u0434\u044c\u0442\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0437\u0430\u0440\u0435\u043d\u0438\u044f\u043c \u0438 \u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0440\u0443\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438!<\/p>\n\n\n\n<h3>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/h3>\n\n\n\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u043c\u0430\u0437, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0443\u043c\u0435\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u043c\u043d\u043e\u0433\u043e:<\/p>\n\n\n\n<ol><li>\u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432;<\/li><li>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043f\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f;<\/li><li>\u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a;<\/li><li>\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/li><\/ol>\n\n\n\n<p><strong>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0432\u0430\u0448?<\/strong>Browsers.js<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import React, { useEffect, useState } from 'react';\nimport { FlatList, Text, View, StyleSheet, Modal, TouchableOpacity } from 'react-native';\n\nimport AddModal from '..\/components\/AddModal';\nimport LoadingIndicator from '..\/components\/LoadingIndicator'\nimport BrowserItem from '..\/components\/BrowserItem'\n\nimport colors from '..\/config\/colors';\n\nfunction Browsers() {\n\n    const URL = 'https:\/\/google.com\/myData.json'\n\n    \/\/ \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    \/\/ {\"Browsers\":[\n    \/\/     {\n    \/\/      \"fullname\": \"Chrome\",\n    \/\/      \"linkToBrowser\": \"https:\/\/google.com\",\n    \/\/      \"image\": \"https:\/\/linktoimage.com\/chrome.png\",\n    \/\/      \"minMemory\": \"1 GB\",\n    \/\/      \"currentVersion\": \"29.0.1\",\n    \/\/      \"minimumRAM\": \"2 GB\",\n    \/\/      \"description\": \"How much RAM do you have? Ha-ha\",\n    \/\/      \"windows\": true,\n    \/\/      \"mac\": true,\n    \/\/      \"linux\": true,\n    \/\/      \"ubuntu\": true,\n    \/\/      \"fedora\": false,\n    \/\/      \"stars\": 4,\n    \/\/      \"id\":\"chrome\"\n    \/\/    },\n    \/\/ ...\n    \/\/ ]\n    \/\/ }\n\n    const [loading, setLoading] = useState(true)\n    const [browsers, setBrowsers] = useState([])\n\n    const [modalVisible, setModalVisible] = useState(false)\n    const [description, setDescription] = useState(\"\")\n\n    const changeDescription = (description) =&gt; {\n        setDescription(description)\n        setModalVisible(!modalVisible)\n    }\n\n    const changeOpacity = () =&gt; {\n        setModalVisible(!modalVisible)\n        console.log('changeOpacity')\n    }\n\n\n\n    useEffect(() =&gt; {\n        fetch(URL)\n            .then((response) =&gt; response.json())\n            .then((responseJson) =&gt; {\n                return responseJson.Browsers\n            })\n            .then(browsers =&gt; {\n                setBrowsers(browsers)\n                \/\/ console.log(browsers)\n                setLoading(false)\n            })\n            .catch(error =&gt; {\n                console.log(error)\n            })\n            .finally(() =&gt; setLoading(false));\n    }, [])\n\n\n    return (\n        &lt;View style={styles.container}&gt;\n            {loading ? (\n                &lt;LoadingIndicator \/&gt;\n            ) : (\n                    &lt;View&gt;\n                        &lt;AddModal \n                            modalVisible={modalVisible}\n                            changeOpacity = {() =&gt; changeOpacity()}\n                            description={description}\n                        \/&gt;\n                        &lt;FlatList\n                            data={browsers}\n                            keyExtractor={browser =&gt; browser.fullname}\n                            renderItem={({ item }) =&gt;\n                                &lt;BrowserItem\n                                    fullname={item.fullname}\n                                    image={item.image}\n                                    linkToBrowser={item.linkToBrowser}\n                                    minMemory={item.minMemory}\n                                    currentVersion={item.currentVersion}\n                                    minimumRAM={item.minimumRAM}\n                                    description={item.description}\n                                    windows={item.windows}\n                                    mac={item.mac}\n                                    linux={item.linux}\n                                    ubuntu={item.ubuntu}\n                                    fedora={item.fedora}\n                                    stars={item.stars}\n                                    changeDescription={() =&gt; changeDescription(item.description)}\n                                \/&gt;\n                            }\n                        \/&gt;\n                    &lt;\/View&gt;\n                )\n            }\n        &lt;\/View &gt;\n    );\n};\n\nconst styles = StyleSheet.create({\n    container: {\n        justifyContent: 'center',\n        alignItems: 'center'\n    },\n})\n\nexport default Browsers;<\/code>\n    <\/pre>\n\n\n\n<h3>\u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u0442\u0430\u043a?<\/h3>\n\n\n\n<p>\u041d\u0443, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \ud83d\ude42 \u0418 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0445\u0443\u043a\u0438, \u0447\u0442\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n\n\n\n<h3>\u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u043d\u0435 \u0442\u0430\u043a?<\/h3>\n\n\n\n<p>\u042d\u0442\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442. \u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u0437\u044f\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n\n\n\n<h3>\u041a \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u0442\u0440\u0435\u043c\u0438\u043c\u0441\u044f?<\/h3>\n\n\n\n<p><strong>\u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2013 \u044d\u0442\u043e&nbsp;<a href=\"https:\/\/medium.com\/@alexmngn\/why-react-developers-should-modularize-their-applications-d26d381854c1\" target=\"_blank\" rel=\"noreferrer noopener\">\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043a\u043e\u0434\u0430<\/a>.<\/strong><\/p>\n\n\n\n<p>\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443 \u0432\u0430\u0441 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u043e\u0432, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u043c.<\/p>\n\n\n\n<ul><li>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u2013 \u043f\u043e\u043c\u043d\u0438\u043c \u043e&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/Don%E2%80%99t_repeat_yourself\" target=\"_blank\" rel=\"noreferrer noopener\">\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 DRY<\/a>!<\/li><li>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u2013 \u0438 \u043b\u0438\u0445\u043e\u0440\u0430\u0434\u043e\u0447\u043d\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/li><li>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u044c \u0431\u0430\u0433\u0438 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u2013 \u043e\u043d\u0438 \u0441\u043c\u0438\u0440\u043d\u043e \u0441\u0438\u0434\u044f\u0442 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438 \u0436\u0434\u0443\u0442 \u0432\u0430\u0441.<\/li><li>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u044c, \u043a\u043e\u0434 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0447\u0435, \u0447\u0438\u0449\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435.<\/li><li>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/li><\/ul>\n\n\n\n<h2>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u043e\u0433\u0440\u0430\u043d\u043a\u0435<\/h2>\n\n\n\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u0435\u043c\u043e\u0432 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0439\u0434\u0435\u043c \u0432\u043e \u0432\u043a\u0443\u0441 \u0438 \u0441\u0434\u0435\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n\n\n\n<h3>\u0428\u0430\u0433 #1. \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0432 \u043f\u0440\u043e\u043f\u0441\u044b<\/h3>\n\n\n\n<p>Browsers.js<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>function Browsers({url = 'https:\/\/google.com\/myData.json'}) {\n\n  const URL = url\n  ...<\/code>\n    <\/pre>\n\n\n\n<p>\u041e\u0434\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2013 \u0438 \u043d\u0430\u0448 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c URL. \u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0448\u0430\u0433 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043f\u0440\u044b\u0436\u043e\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430!<\/p>\n\n\n\n<h3>\u0428\u0430\u0433 #2. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h3>\n\n\n\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u2013 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.&nbsp;<a href=\"https:\/\/medium.com\/@alexmngn\/why-react-developers-should-modularize-their-applications-d26d381854c1\" target=\"_blank\" rel=\"noreferrer noopener\">\u0416\u0438\u0437\u043d\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u043a\u043e\u0433\u0434\u0430 UI \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445, \u043b\u043e\u0433\u0438\u043a\u0435 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a>.<\/p>\n\n\n\n<p><strong>\u0412 \u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430?<\/strong><\/p>\n\n\n\n<p><strong>\u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430:<\/strong>&nbsp;\u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0412\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0438&nbsp;<code>&lt;Browsers\/&gt;<\/code>&nbsp;\u0434\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438&nbsp;<code>return<\/code>.<\/p>\n\n\n\n<p><strong>\u041b\u043e\u0433\u0438\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/strong>&nbsp;\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u0412\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438&nbsp;<code>return<\/code>&nbsp;\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<\/p>\n\n\n\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043c \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u0438 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0436\u0438\u0437\u043d\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043b\u0430 \u043f\u0440\u043e\u0449\u0435:<\/p>\n\n\n\n<ul><li>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0445\u0443\u043a&nbsp;<code>useBrowsers()<\/code>&nbsp;\u0441 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u043e\u0439.<\/li><li>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442&nbsp;<code>&lt;BrowsersList \/&gt;<\/code>&nbsp;\u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/li><\/ul>\n\n\n\n<p>Browsers_splitted.js<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import React, {useEffect, useState} from 'react'\nimport {FlatList, StyleSheet, View} from 'react-native'\n\nimport AddModal from '..\/components\/AddModal'\nimport LoadingIndicator from '..\/components\/LoadingIndicator'\nimport BrowserItem from '..\/components\/BrowserItem'\n\nconst styles = StyleSheet.create({\n  container: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n})\n\nfunction useBrowsers(url) {\n  const [loading, setLoading] = useState(true)\n  const [browsers, setBrowsers] = useState([])\n\n  const [modalVisible, setModalVisible] = useState(false)\n  const [description, setDescription] = useState('')\n\n  const changeDescription = (description) =&gt; {\n    setDescription(description)\n    setModalVisible(!modalVisible)\n  }\n\n  const changeOpacity = () =&gt; {\n    setModalVisible(!modalVisible)\n    console.log('changeOpacity')\n  }\n\n  useEffect(() =&gt; {\n    fetch(URL)\n      .then((response) =&gt; response.json())\n      .then((responseJson) =&gt; {\n        return responseJson.Browsers\n      })\n      .then((browsers) =&gt; {\n        setBrowsers(browsers)\n        \/\/ console.log(browsers)\n        setLoading(false)\n      })\n      .catch((error) =&gt; {\n        console.log(error)\n      })\n      .finally(() =&gt; setLoading(false))\n  }, [])\n\n  return {\n    loading,\n    browsers,\n    modalVisible,\n    description,\n    changeDescription,\n    changeOpacity,\n  }\n}\n\nfunction BrowsersList({\n  loading,\n  browsers,\n  modalVisible,\n  description,\n  changeDescription,\n  changeOpacity,\n}) {\n  return (\n    &lt;View style={styles.container}&gt;\n      {loading ? (\n        &lt;LoadingIndicator \/&gt;\n      ) : (\n        &lt;View&gt;\n          &lt;AddModal\n            modalVisible={modalVisible}\n            changeOpacity={() =&gt; changeOpacity()}\n            description={description}\n          \/&gt;\n          &lt;FlatList\n            data={browsers}\n            keyExtractor={(browser) =&gt; browser.fullname}\n            renderItem={({item}) =&gt; (\n              &lt;BrowserItem\n                fullname={item.fullname}\n                image={item.image}\n                linkToBrowser={item.linkToBrowser}\n                minMemory={item.minMemory}\n                currentVersion={item.currentVersion}\n                minimumRAM={item.minimumRAM}\n                description={item.description}\n                windows={item.windows}\n                mac={item.mac}\n                linux={item.linux}\n                ubuntu={item.ubuntu}\n                fedora={item.fedora}\n                stars={item.stars}\n                changeDescription={() =&gt; changeDescription(item.description)}\n              \/&gt;\n            )}\n          \/&gt;\n        &lt;\/View&gt;\n      )}\n    &lt;\/View&gt;\n  )\n}\n\nfunction Browsers() {\n  return &lt;BrowsersList {...useBrowsers('https:\/\/google.com\/myData.json')} \/&gt;\n}\n\nexport default Browsers<\/code>\n    <\/pre>\n\n\n\n<p>\u041a\u043e\u0434 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0434\u0430\u043b\u0435\u043a \u043e\u0442 \u0438\u0434\u0435\u0430\u043b\u0430, \u043d\u043e \u0443\u0436\u0435 \u0441\u0442\u0430\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n\n\n\n<ul><li><code>&lt;BrowsersList \/&gt;<\/code>&nbsp;\u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432).<\/li><li><code>useBrowsers()<\/code>&nbsp;\u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0434\u0438\u0437\u0430\u0439\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u044d\u0442\u043e\u0442 \u0445\u0443\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/li><\/ul>\n\n\n\n<h3>\u0428\u0430\u0433 #3. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u044b<\/h3>\n\n\n\n<p>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0442\u0430\u043b\u0430 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0439 \u0438 \u0433\u043e\u0434\u043d\u043e\u0439 \u043a \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u0434 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435&nbsp;\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435&nbsp;\u043c\u043e\u0434\u0443\u043b\u0438. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0435\u043c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0435\u0435, \u0442\u0435\u043c \u0440\u0435\u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u0435\u0435.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/bec63cb5a6f8cf9027922bea554d8d95.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u042d\u0442\u043e&nbsp;<a href=\"https:\/\/medium.com\/hackernoon\/the-100-correct-way-to-structure-a-react-app-or-why-theres-no-such-thing-3ede534ef1ed\" target=\"_blank\" rel=\"noreferrer noopener\">\u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e React-\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a>:<\/p>\n\n\n\n<ol><li>index.js \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442&nbsp;<code>&lt;Browsers\/&gt;<\/code>&nbsp;\u0438\u0437 Browsers.jsx;<\/li><li>\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0434\u043b\u044f&nbsp;<code>&lt;Browsers\/&gt;<\/code>&nbsp;\u043b\u0435\u0436\u0430\u0442 \u0432 \u043f\u0430\u043f\u043a\u0430\u0445 components \u0438 hooks;<\/li><\/ol>\n\n\n\n<p>BrowsersList.jsx \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u044c \u0434\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0445\u0443\u043a\u0430\u043c\u0438, \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0444\u0430\u0439\u043b\u043e\u043c index.js<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/1fa4e7acda9d31cd2d9e2d8807609999.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 BrowsersList.jsx:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import React from 'react'\nimport {FlatList, StyleSheet, View} from 'react-native'\nimport AddModal from '..\/..\/..\/components\/AddModal'\nimport LoadingIndicator from '..\/..\/..\/components\/LoadingIndicator'\nimport BrowserItem from '..\/..\/..\/components\/BrowserItem'\n\nconst styles = StyleSheet.create({\n  container: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n})\n\nexport function BrowsersList({\n  loading,\n  browsers,\n  modalVisible,\n  description,\n  changeDescription,\n  changeOpacity,\n}) {\n  return (\n    &lt;View style={styles.container}&gt;\n      {loading ? (\n        &lt;LoadingIndicator \/&gt;\n      ) : (\n        &lt;View&gt;\n          &lt;AddModal\n            modalVisible={modalVisible}\n            changeOpacity={() =&gt; changeOpacity()}\n            description={description}\n          \/&gt;\n          &lt;FlatList\n            data={browsers}\n            keyExtractor={(browser) =&gt; browser.fullname}\n            renderItem={({item}) =&gt; (\n              &lt;BrowserItem\n                fullname={item.fullname}\n                image={item.image}\n                linkToBrowser={item.linkToBrowser}\n                minMemory={item.minMemory}\n                currentVersion={item.currentVersion}\n                minimumRAM={item.minimumRAM}\n                description={item.description}\n                windows={item.windows}\n                mac={item.mac}\n                linux={item.linux}\n                ubuntu={item.ubuntu}\n                fedora={item.fedora}\n                stars={item.stars}\n                changeDescription={() =&gt; changeDescription(item.description)}\n              \/&gt;\n            )}\n          \/&gt;\n        &lt;\/View&gt;\n      )}\n    &lt;\/View&gt;\n  )\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u044d\u043a\u0440\u0430\u043d \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430. \u041c\u0435\u043d\u044c\u0448\u0435 \u0445\u043b\u0430\u043c\u0430 \u2013 \u043b\u0435\u0433\u0447\u0435 \u0447\u0438\u0442\u0430\u0442\u044c!<\/p>\n\n\n\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0433\u0430\u0434\u043a\u043e\u0433\u043e \u0443\u0442\u0435\u043d\u043a\u0430 \u0432 \u0440\u0435\u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u043b\u0435\u0431\u0435\u0434\u044f, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e&nbsp;<strong>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0435<\/strong>.<\/p>\n\n\n\n<h3>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n\n\n\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&nbsp;<code>&lt;BrowsersList \/&gt;<\/code>. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u043f\u0441, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,&nbsp;<code>changeDescription<\/code>&nbsp;\u043d\u0430&nbsp;<code>setSelectedBrowser<\/code>? \u0418\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442? \u0418\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439?<\/p>\n\n\n\n<p><strong>\u0412\u0441\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f!<\/strong><\/p>\n\n\n\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0433\u0434\u0435 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0410 \u0432\u044b \u043d\u0435 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u0440\u0435\u0434\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u043e.&nbsp;\u0412\u0430\u0448\u0430 IDE \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0438 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043a\u0438. \u042d\u0442\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043a\u0440\u0443\u0442\u043e. \u0414\u0430\u0436\u0435 \u0431\u043e\u043b\u0435\u0435: \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c, \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430.<\/p>\n\n\n\n<p><em>\u041d\u0443 \u0438 \u0433\u0434\u0435 \u043f\u0440\u043e\u0444\u0438\u0442-\u0442\u043e, \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0432\u044b? \u041e\u043f\u044f\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u2013 \u0438 \u043f\u0440\u043e\u0449\u0430\u0439 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d.<\/em><\/p>\n\n\n\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435 \u043b\u0438 \u0442\u0443\u0442 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435?<\/p>\n\n\n\n<p>\u0424\u0430\u0439\u043b useBrowsers.js:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>...\nreturn {\n    loading,\n    browsers,\n    modalVisible,\n    descripton,\n    changeDescription,\n    changeOpacity,\n  }\n...<\/code>\n    <\/pre>\n\n\n\n<p>\u0424\u0430\u0439\u043b BrowsersList.jsx:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>...\nexport function BrowsersList({\n  loading,\n  browsers,\n  modalVisible,\n  description,\n  changeDescription,\n  changeOpacity,\n}) {\n....<\/code>\n    <\/pre>\n\n\n\n<p>\u0411\u0438\u043d\u0433\u043e! \u041e\u0434\u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u2013 \u0438 \u0432\u0441\u0435 \u0438\u0434\u0435\u0442 \u043a\u0443\u0432\u044b\u0440\u043a\u043e\u043c.<\/p>\n\n\n\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e&nbsp;\u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0445&nbsp;\u0447\u0430\u0441\u043e\u0432 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u043f\u0440\u043e\u043f\u0441\u044b \u0438 \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c \u2013 \u043d\u043e \u043c\u044b-\u0442\u043e \u0441 \u0432\u0430\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a\u0438\u0435! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n\n\n\n<h3>\u0425\u0432\u0430\u0442\u0438\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043a\u043e\u0434\u0438\u0442\u044c \u043d\u0430 JS, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u043e\u0434\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430 TS<\/h3>\n\n\n\n<p>\u0412 2021 \u0433\u043e\u0434\u0443 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 TypeScript. \u0412\u0430\u043c \u0434\u0430\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0432\u0435\u0434\u044c \u043c\u043e\u0436\u043d\u043e&nbsp;<a href=\"https:\/\/slack.engineering\/typescript-at-slack\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c TS \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u043d\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438<\/a>, \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/869eae56e2ce67326f89cc5b081fbc20.png\" alt=\"38% \u0431\u0430\u0433\u043e\u0432 \u043d\u0430 Airbnb \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TypeScript\"\/><figcaption>38% \u0431\u0430\u0433\u043e\u0432 \u043d\u0430 Airbnb \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TypeScript<\/figcaption><\/figure>\n\n\n\n<p>\u0421 TypeScript \u0432\u0430\u0448\u0430 IDE \u043e\u0431\u043e\u0433\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u0440\u0443\u0442\u044b\u043c\u0438 \u0444\u0438\u0447\u0430\u043c\u0438:<\/p>\n\n\n\n<ul><li><strong>\u0410\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0441\u043e\u0432<\/strong><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/fc1c9d93067c179c454c81efb7a0d2ea.gif\" alt=\"\"\/><\/figure>\n\n\n\n<ul><li><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0441\u043e\u0432<\/strong><\/li><li><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 null\/undefined<\/strong><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/7a319c243b1ce4a1a1cc2084858d2f0b.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul><li><strong>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u043f\u0441\u043e\u0432<\/strong><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/e423d27ac94d090bc76e63c7f29eb187.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>TypeScript \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0432\u0430\u043c \u0442\u043e\u043d\u043d\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u0440\u0432\u043e\u0432.<\/p>\n\n\n\n<p>\u0410 \u0432\u043e\u0442, \u043a\u0441\u0442\u0430\u0442\u0438, \u0438 \u043d\u0430\u0448\u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/2dd5d6fee1687cd4dcc8fef2ef5b06d8.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3>\u0428\u0430\u0433 #4. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432<\/h3>\n\n\n\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0433\u0430\u0439\u0434 \u043f\u043e TypeScript, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u0445 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u0412\u0441\u0435 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430&nbsp;<a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/basic-types.html\" target=\"_blank\" rel=\"noreferrer noopener\">typescriptlang.org<\/a>&nbsp;<em>(\u0438\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c&nbsp;<a href=\"https:\/\/proglib.io\/p\/samouchitel-dlya-nachinayushchih-kak-osvoit-typescript-s-nulya-za-30-minut-2021-03-12\" target=\"_blank\" rel=\"noreferrer noopener\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a>&nbsp;\u0432 \u00ab\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u00bb \u2013&nbsp;<strong>\u043f\u0440\u0438\u043c. \u0440\u0435\u0434.<\/strong>)<\/em>. \u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a&nbsp;<code>&lt;BrowsersList \/&gt;<\/code>&nbsp;\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0441\u044b \u0432 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441 .jsx \u043d\u0430 .tsx).BrowsersList_props_types.tsx<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>\/\/ ...\n\nexport type Browser = {\n  fullname: string \/\/ \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \"fullname\" - \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430\n  image: string\n  linkToBrowser: string\n  minMemory: string\n  currentVersion: string\n  minimumRAM: string\n  description: string\n  windows: boolean\n  mac: boolean\n  linux: boolean\n  ubuntu: boolean\n  fedora: boolean\n  stars: number\n}\n\nexport type BrowsersListProps = {\n  loading: boolean\n  browsers: Browser[] \/\/ \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \"browsers\" \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0438\u043f\u043e\u043c Browser\n  modalVisible: boolean\n  description: string\n  \n  \/\/ \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e changeDescription - \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\n  \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\n  changeDescription: (description: string) =&gt; void\n  \n  \/\/ \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e changeOpacity - \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\n  \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\n  changeOpacity: () =&gt; void\n}\n\nexport function BrowsersList({\n  loading,\n  browsers,\n  modalVisible,\n  description,\n  changeDescription,\n  changeOpacity,\n}: BrowsersListProps) {\n  return (\n\n\/\/ ...<\/code>\n    <\/pre>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443&nbsp;<code>useBrowsers()<\/code>:useBrowsers.ts<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import {useEffect, useState} from 'react'\nimport {BrowsersListProps} from '..\/components\/BrowsersList'\n\nexport function useBrowsers(url: string): BrowsersListProps {\n  const [loading, setLoading] = useState(true)\n  \n \/\/ ...<\/code>\n    <\/pre>\n\n\n\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c TypeScript \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b&nbsp;<code>useBrowsers()<\/code>&nbsp;\u0438&nbsp;<code>BrowsersList<\/code>&nbsp;\u0431\u044b\u043b\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b.<\/p>\n\n\n\n<h4>\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/h4>\n\n\n\n<p><code>BrowsersListProps<\/code>&nbsp;\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e:props.tsx<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>export type BrowsersListProps = {\n  loading: boolean\n  browsers: Browser[]\n  modalVisible: boolean\n  description: string\n  changeDescription: (description: string) =&gt; void\n  changeOpacity: () =&gt; void\n}<\/code>\n    <\/pre>\n\n\n\n<ul><li>\u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u2013 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/li><li>\u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u2013 \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432.<\/li><li>\u0426\u0435\u043b\u044b\u0445 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438&nbsp;\u2013 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435. \u0415\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f. \u0410 \u044d\u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c.<\/li><\/ul>\n\n\n\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0438 \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430&nbsp;<code>Browser<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/c6b55516e874fd5146c5e0babbaea0b4.png\" alt=\"TypeScript \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043f\u0440\u0438 \u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438\"\/><figcaption>TypeScript \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043f\u0440\u0438 \u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438<\/figcaption><\/figure>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c TypeScript: \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d.&nbsp;\u041f\u0438\u0441\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041e\u043d\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435, \u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0431\u0435\u0437 \u043a\u043e\u0434\u0430, \u043e\u0434\u043d\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043c&nbsp;<code>&lt;BrowserList \/&gt;<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439&nbsp;<code>BrowsersListProps<\/code>.<\/p>\n\n\n\n<p>\u041e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043c&nbsp;<code>&lt;BrowserItem \/&gt;<\/code>. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u043f\u0441\u043e\u0432, \u0438 \u044d\u0442\u043e \u044f\u0432\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0434\u043b\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e 2 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:BrowsersList.tsx<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import React from 'react'\nimport {FlatList, StyleSheet, View} from 'react-native'\nimport AddModal from '..\/..\/..\/components\/AddModal'\nimport LoadingIndicator from '..\/..\/..\/components\/LoadingIndicator'\nimport BrowserItem from '..\/..\/..\/components\/BrowserItem'\n\nconst styles = StyleSheet.create({\n  container: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n})\n\nexport type Browser = {\n  fullname: string\n  image: string\n  linkToBrowser: string\n  minMemory: string\n  currentVersion: string\n  minimumRAM: string\n  description: string\n  windows: boolean\n  mac: boolean\n  linux: boolean\n  ubuntu: boolean\n  fedora: boolean\n  stars: number\n}\n\nexport type BrowsersListProps = {\n  loading: boolean\n  browsers?: Browser[]\n  selectedBrowser?: Browser\n  setSelectedBrowser: (browser?: Browser) =&gt; void\n}\n\nexport function BrowsersList(props: BrowsersListProps) {\n  const {loading, selectedBrowser, setSelectedBrowser, browsers} = props\n  return (\n    &lt;View style={styles.container}&gt;\n      {loading ? (\n        &lt;LoadingIndicator \/&gt;\n      ) : (\n        &lt;View&gt;\n          &lt;AddModal\n            modalVisible={Boolean(selectedBrowser)}\n            onClose={() =&gt; setSelectedBrowser(undefined)}\n            description={selectedBrowser?.description}\n          \/&gt;\n          &lt;FlatList\n            data={browsers}\n            keyExtractor={(browser) =&gt; browser.fullname}\n            renderItem={({item}) =&gt; (\n              &lt;BrowserItem\n                browser={item}\n                onPress={() =&gt; setSelectedBrowser(item)}\n              \/&gt;\n            )}\n          \/&gt;\n        &lt;\/View&gt;\n      )}\n    &lt;\/View&gt;\n  )\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u0442\u0430\u043b \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435.<\/p>\n\n\n\n<h3>\u0428\u0430\u0433 #5. \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 &lt;UIFriendlyList \/&gt;<\/h3>\n\n\n\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u0434\u0438\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0442\u043e \u043d\u0430 \u0432\u0430\u0441 \u0441\u043d\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0432\u0435\u0442\u043b\u0435\u043d\u0438\u0435. \u0421\u043f\u0438\u0441\u043e\u043a \u0441 &#8220;\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438&#8221; \u2013 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u0430\u044f \u0438 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e.<\/p>\n\n\n\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0440\u043e\u0432\u0430\u043d\u0430 \u0432&nbsp;<code>&lt;BrowsersList \/&gt;<\/code>. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u043e \u0435\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u044c.&nbsp;\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442&nbsp;<code>&lt;UIFriendlyList \/&gt;<\/code>&nbsp;\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e&nbsp;<code>&lt;FlatList\/ &gt;<\/code>.<\/p>\n\n\n\n<p>\u041a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>type UIFriendlyListProps&lt;T&gt; = FlatListProps&lt;T&gt; &amp; {loading?: boolean}\n<\/code>\n    <\/pre>\n\n\n\n<ul><li><code>T<\/code>&nbsp;\u2013 \u044d\u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0442\u0438\u043f\u0430, \u0438\u043b\u0438&nbsp;<a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/generics.html\" target=\"_blank\" rel=\"noreferrer noopener\">\u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a<\/a>. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e&nbsp;<code>arg<\/code>&nbsp;\u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435&nbsp;<code>foo(arg)<\/code>. \u0414\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438 \u043d\u0443\u0436\u043d\u044b, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0442\u0438\u043f \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0438\u043f\u0430.&nbsp;<a href=\"https:\/\/rossbulat.medium.com\/typescript-generics-explained-15c6493b510f\" target=\"_blank\" rel=\"noreferrer noopener\">\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439\u0448\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432<\/a>.<\/li><li><code>&amp;<\/code>&nbsp;\u2013 \u044d\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 (<a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/unions-and-intersections.html#intersection-types\" target=\"_blank\" rel=\"noreferrer noopener\">\u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043a\u0446\u0438\u044f<\/a>). \u0422\u0438\u043f&nbsp;<code>X = A &amp; B<\/code>&nbsp;\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e&nbsp;<code>X<\/code>&nbsp;\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430&nbsp;<code>A<\/code>&nbsp;\u0438&nbsp;<code>B<\/code>.<\/li><\/ul>\n\n\n\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438:<\/p>\n\n\n\n<ul><li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0442\u0438\u043f \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0441\u043e\u0432 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/li><li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/li><li><code>UIFriendlyListProps<\/code>&nbsp;\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441&nbsp;<code>FlatListProps<\/code>&nbsp;\u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 React Native \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/li><\/ul>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b UIFriendlyList.jsx:UIFriendlyList.tsx<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import React from 'react'\nimport {FlatList, FlatListProps, Text} from 'react-native'\nimport LoadingIndicator from '.\/LoadingIndicator'\n\nexport type UIFriendlyListProps&lt;T&gt; = FlatListProps&lt;T&gt; &amp; {loading?: boolean}\n\nexport function UIFriendlyList&lt;T&gt;(props: UIFriendlyListProps&lt;T&gt;) {\n  if (props.loading) {\n    return &lt;LoadingIndicator \/&gt;\n  }\n\n  if (props?.data &amp;&amp; props.data.length === 0) {\n    return &lt;Text&gt;This list is empty (&lt;\/Text&gt;\n  }\n\n  return &lt;FlatList {...props} \/&gt;\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0435\u0449\u0435 \u043f\u0443\u0441\u0442\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044e\u0437\u0435\u0440\u0443, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0443\u0441\u0442 \u0438 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0436\u0434\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u042d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f UX.<\/p>\n\n\n\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442&nbsp;<code>&lt;UIFriendlyList \/&gt;<\/code>&nbsp;\u2013 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c \u0435\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n\n\n\n<p>\u0412\u043e \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u043d\u0430\u0448&nbsp;<code>&lt;BrowsersList \/&gt;<\/code>:BrowsersList.tsx<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import React from 'react'\nimport {StyleSheet, View} from 'react-native'\nimport AddModal from '..\/..\/..\/components\/AddModal'\nimport BrowserItem from '..\/..\/..\/components\/BrowserItem'\nimport {UIFriendlyList} from '..\/..\/..\/components\/UIFriendlyList'\n\nconst styles = StyleSheet.create({\n  container: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n})\n\nexport type Browser = {\n  fullname: string\n  image: string\n  linkToBrowser: string\n  minMemory: string\n  currentVersion: string\n  minimumRAM: string\n  description: string\n  windows: boolean\n  mac: boolean\n  linux: boolean\n  ubuntu: boolean\n  fedora: boolean\n  stars: number\n}\n\nexport type BrowsersListProps = {\n  loading: boolean\n  browsers?: Browser[]\n  selectedBrowser?: Browser\n  setSelectedBrowser: (browser?: Browser) =&gt; void\n}\n\nexport function BrowsersList(props: BrowsersListProps) {\n  const {loading, selectedBrowser, setSelectedBrowser, browsers} = props\n  return (\n    &lt;View style={styles.container}&gt;\n      &lt;AddModal\n        modalVisible={Boolean(selectedBrowser)}\n        onClose={() =&gt; setSelectedBrowser(undefined)}\n        description={selectedBrowser?.description}\n      \/&gt;\n      &lt;UIFriendlyList\n        loading={loading}\n        data={browsers}\n        renderItem={({item}) =&gt; (\n          &lt;BrowserItem\n            key={item.fullname}\n            browser={item}\n            onPress={() =&gt; setSelectedBrowser(item)}\n          \/&gt;\n        )}\n      \/&gt;\n    &lt;\/View&gt;\n  )\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u0441&nbsp;<a href=\"https:\/\/gist.github.com\/aleksejkozin\/98ebb0c3fc826c23bbd9afc30cfda24f\" target=\"_blank\" rel=\"noreferrer noopener\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c<\/a>. \u041e\u043d \u043f\u043e\u0447\u0442\u0438 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442&nbsp;<code>&lt;UIFriendlyList \/&gt;<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0432\u0430\u043c \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.&nbsp;\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a \u043b\u043e\u0433\u0438\u043a\u0443&nbsp;<strong>\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u041e\u043a\u043d\u043e \u0441\u043e \u0421\u043f\u0438\u0441\u043a\u043e\u043c<\/strong>, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f.<\/p>\n\n\n\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d, \u043d\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u0435\u043d. \u0412 \u043f\u043e\u0433\u043e\u043d\u0435 \u0437\u0430 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u0434\u0435\u0430\u043b\u043e\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0443\u0449\u0435\u0440\u0431 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443&nbsp;<a href=\"https:\/\/medium.com\/the-non-traditional-developer\/stop-writing-reusable-react-components-bd649cba2700\" target=\"_blank\" rel=\"noreferrer noopener\">\u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f<\/a>.<\/p>\n\n\n\n<p>\u041c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0440\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0435.<\/p>\n\n\n\n<h3>\u0428\u0430\u0433 #6. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 useBrowsers()<\/h3>\n\n\n\n<p>\u0425\u0443\u043a&nbsp;<code>useBrowswers()<\/code>&nbsp;\u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c BrowsersListProps:useBrowsers.ts<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import {useEffect, useState} from 'react'\nimport {Browser, BrowsersListProps} from '..\/components\/BrowsersList'\n\nexport function useBrowsers(url: string): BrowsersListProps {\n  const [loading, setLoading] = useState(false)\n  const [browsers, setBrowsers] = useState&lt;Browser[]&gt;([])\n  const [selectedBrowser, setSelectedBrowser] = useState&lt;Browser | undefined&gt;(\n    undefined,\n  )\n\n  useEffect(() =&gt; {\n    setLoading(true)\n    fetch(url)\n      .then((response) =&gt; response.json())\n      .then((responseJson) =&gt; {\n        return responseJson.Browsers\n      })\n      .then((browsers) =&gt; {\n        setBrowsers(browsers)\n      })\n      .catch((error) =&gt; {\n        console.log(error)\n      })\n      .finally(() =&gt; setLoading(false))\n  }, [url])\n\n  return {\n    loading,\n    browsers,\n    selectedBrowser,\n    setSelectedBrowser,\n  }\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u041f\u0440\u0438\u0433\u043b\u044f\u0434\u0438\u043c\u0441\u044f \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c&nbsp;<em>&#8220;\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 URL \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438&#8221;<\/em>&nbsp;\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0435\u0435 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0445\u0443\u043a&nbsp;<code>useFetch<\/code>.<\/p>\n\n\n\n<p>\u041a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0438\u043f\u044b. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b useFetch \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0424\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a:useFetch.ts<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>export type FetchBrowsersResults = {\n  Browsers: Browser[]\n}\n\nexport type UseFetch&lt;T&gt; = {\n  loading: boolean\n  \n  \/\/ We use Generic. T - is a type argument that can be any type.\n  \/\/ We can useFetch() with any type\n  \/\/ ? means, that T can be undefined\n  data?: T\n}\n\nexport function useFetch&lt;T&gt;(url: string): UseFetch&lt;T&gt; {}<\/code>\n    <\/pre>\n\n\n\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c,&nbsp;<code>useFetch<\/code>&nbsp;\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:useFetch.ts<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import {useEffect, useState} from 'react'\nimport {Alert} from 'react-native'\n\nexport type UseFetch&lt;T&gt; = {\n  loading: boolean\n  data?: T \n}\n\nexport function useFetch&lt;T&gt;(url: string): UseFetch&lt;T&gt; {\n  const [loading, setLoading] = useState&lt;boolean&gt;(false)\n  const [data, setData] = useState&lt;T | undefined&gt;(undefined)\n\n  useEffect(() =&gt; {\n    setLoading(true)\n    fetch(url)\n      .then((response) =&gt; response.json())\n      .then(setData)\n      .finally(() =&gt; setLoading(false))\n      .catch((error) =&gt; Alert.alert('Fetch error', error))\n  }, [url])\n\n  return {\n    loading,\n    data,\n  }\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438&nbsp;<code>Alert<\/code>&nbsp;\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043c&nbsp;<code>useBrowsers()<\/code>:useBrowsers.ts<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        <code>import {useState} from 'react'\nimport {Browser, BrowsersListProps} from '..\/components\/BrowsersList'\nimport {useFetch} from '..\/..\/..\/hooks\/useFetch'\n\nexport type FetchBrowsersResults = {\n  Browsers: Browser[]\n}\n\nexport function useBrowsers(url: string): BrowsersListProps {\n  const {loading, data} = useFetch&lt;FetchBrowsersResults&gt;(url)\n  const [selectedBrowser, setSelectedBrowser] = useState&lt;Browser | undefined&gt;(\n    undefined,\n  )\n\n  return {\n    loading,\n    browsers: data?.Browsers,\n    selectedBrowser,\n    setSelectedBrowser,\n  }\n}<\/code>\n    <\/pre>\n\n\n\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u0441&nbsp;<a href=\"https:\/\/gist.github.com\/aleksejkozin\/98ebb0c3fc826c23bbd9afc30cfda24f\" target=\"_blank\" rel=\"noreferrer noopener\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c<\/a>.<\/p>\n\n\n\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0437\u0434\u0435\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0447\u0435\u0433\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \ud83d\ude42<\/p>\n\n\n\n<h2>4 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043e\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n\n\n\n<h3>1. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u043e\u0434 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/h3>\n\n\n\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 IDE, ESLint \u0438 Prettier.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/a6db08adc9ff891a303703c8b7bcb66e.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3>2. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/h3>\n\n\n\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/06dd534e96a85d0a3364e797b46b6134.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3>3. \u041d\u0430\u0443\u0447\u0438\u0442\u0435\u0441\u044c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0435\u0434\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n\n\n\n<p>\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u0438 \u0432\u044b \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u043a \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0439:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/880db952688c5ed332e7caef98e5c092.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u041f\u0440\u0438\u0432\u044b\u043a\u043d\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 IDE: \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n\n\n\n<h3>4. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043b\u0438\u043d\u0442\u0438\u043d\u0433<\/h3>\n\n\n\n<p>\u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 \u0445\u0438\u0442\u0440\u044b\u0435 \u0438 \u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/media.proglib.io\/posts\/2021\/04\/07\/cc695aac56efbf7004d000bd4259a5fd.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>***<\/p>\n\n\n\n<h2>\u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n\n\n\n<p>\u0427\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u043c, \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0432 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439:<\/p>\n\n\n\n<ul><li>\u041e\u0442\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/li><li>\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0440\u0435\u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<\/li><li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TypeScript \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432.<\/li><li>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0435.<\/li><li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u044e\u0448\u043a\u0438 \u0432\u0430\u0448\u0435\u0439 IDE.<\/li><\/ul>\n\n\n\n<p>\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u043f\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0434\u0437\u0435\u043d \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438? \u041f\u0440\u0438\u0437\u043d\u0430\u0432\u0430\u0439\u0442\u0435\u0441\u044c, \u0447\u0430\u0441\u0442\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u0435?<\/p>\n\n\n\n<p><strong>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b:<\/strong><\/p>\n\n\n\n<ul><li><a href=\"https:\/\/proglib.io\/p\/samouchitel-dlya-nachinayushchih-kak-osvoit-typescript-s-nulya-za-30-minut-2021-03-12\" target=\"_blank\" rel=\"noreferrer noopener\">\u0421\u0430\u043c\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445: \u043a\u0430\u043a \u043e\u0441\u0432\u043e\u0438\u0442\u044c TypeScript \u0441 \u043d\u0443\u043b\u044f \u0437\u0430 30 \u043c\u0438\u043d\u0443\u0442?<\/a><\/li><li><a href=\"https:\/\/proglib.io\/p\/demistifikaciya-hukov-react-usecallback-usememo-i-vse-vse-vse-2021-02-28\" target=\"_blank\" rel=\"noreferrer noopener\">\u0414\u0435\u043c\u0438\u0441\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0445\u0443\u043a\u043e\u0432 React: useCallback, useMemo \u0438 \u0432\u0441\u0435-\u0432\u0441\u0435-\u0432\u0441\u0435<\/a><\/li><li><a href=\"https:\/\/proglib.io\/p\/8-moshchnyh-bibliotek-react-kotorye-stoit-poprobovat-v-2021-godu-2021-01-15\" target=\"_blank\" rel=\"noreferrer noopener\">8 \u043c\u043e\u0449\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a React, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432 2021 \u0433\u043e\u0434\u0443<\/a><\/li><li><a href=\"https:\/\/proglib.io\/p\/33-priema-optimizacii-javascript-kotorye-vy-dolzhny-znat-v-2021-godu-2021-01-12\" target=\"_blank\" rel=\"noreferrer noopener\">33 \u043f\u0440\u0438\u0435\u043c\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 JavaScript, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u043d\u0430\u0442\u044c \u0432 2021 \u0433\u043e\u0434\u0443<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430! \u041f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u2013 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[30],"tags":[65],"_links":{"self":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts\/2086"}],"collection":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2086"}],"version-history":[{"count":1,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts\/2086\/revisions"}],"predecessor-version":[{"id":2087,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts\/2086\/revisions\/2087"}],"wp:attachment":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}