Як отримати просунуті компоненти

0 Comments

Компоненти і пропси

Компоненти дозволяють розділити інтерфейс користувача на незалежні частини, придатні до повторного використання, і сприймати їх як такі, що функціонують окремо один від одного. На цій сторінці викладений вступ до ідеї компонентів. Ви можете знайти докладний опис API компонентів тут.

Концептуально компоненти є подібними до функцій JavaScript. Вони приймають довільні вхідні дані (так звані “пропси”) і повертають React-елементи, що описують те, що повинно з’явитися на екрані.

Функціональні та класові компоненти

Найпростішим способом визначення компонента є написання функції JavaScript:

function Welcome(props)  return h1>Привіт, props.name>h1>; >

Ця функція є валідним React-компонентом, оскільки вона приймає єдиний аргумент “пропс” (скорочено від properties – властивості), який є об’єктом з даними і повертає React-елемент. Такі компоненти ми називаємо “функціональними компонентами”, оскільки вони буквально є JavaScript функціями.

Ви також можете використовувати ES6 класи, щоб визначити компонент:

class Welcome extends React.Component  render()  return h1>Привіт, this.props.name>h1>; > >

Два компоненти, що наведені вище, є еквівалентними з точки зору React.

Функціональні та класові компоненти мають деякі додаткові особливості, які ми обговоримо в наступних розділах.

Раніше ми зустрічали лише React-елементи, які представляють теги DOM:

const element = div />;

Однак елементи можуть також представляти визначені користувачем компоненти:

const element = Welcome name="Василина" />;

Коли React бачить елемент, що представляє визначений користувачем компонент, він передає атрибути JSX та дочірні компоненти цьому компоненту як єдиний об’єкт. Ми називаємо цей об’єкт “пропси”.

Наприклад, код нижче виводить на сторінці “Привіт, Василина”:

function Welcome(props)  return h1>Привіт, props.name>h1>; > const root = ReactDOM.createRoot(document.getElementById('root')); const element = Welcome name="Василина" />;root.render(element);

Давайте розберемо, що відбувається в цьому прикладі:

  1. Ми викликаємо root.render() з елементом .
  2. React викликає компонент Welcome з пропсом .
  3. Welcome компонент повертає елемент

    Привіт, Василина

    .

  4. React DOM ефективно оновлює DOM для отримання

    Привіт, Василина

    .

Примітка: Завжди починайте писати імена компонентів з великої літери.

React розглядає компоненти, що починаються з малих літер, як теги DOM. Наприклад, представляє тег HTML div, але являє собою компонент і вимагає, щоб Welcome знаходився в області застосування.

Щоб дізнатися більше про причини такої поведінки, прочитайте Поглиблений розгляд JSX.

Компоненти можуть посилатися на інші компоненти під час виведення. Це дозволяє нам використовувати одну і ту ж абстракцію компонентів для будь-якого рівня деталізації. Кнопка, форма, діалогове вікно, екран: у React-додатках всі вони зазвичай виражаються як компоненти.

Наприклад, ми можемо створити компонент App , що відрендерить компонент Welcome багато разів:

function Welcome(props)  return h1>Привіт, props.name>h1>; > function App()  return ( div> Welcome name="Василина" />  Welcome name="Михайло" />  Welcome name="Вадим" />  div> ); >

Як правило, нові React-додатки мають єдиний компонент App , що знаходиться зверху дерева ієрархій елементів. Однак, якщо ви інтегруєте React у існуючий додаток, ви можете почати знизу вгору з невеликим компонентом, наприклад Button , і поступово працювати у верхній частині ієрархії перегляду.

Розбиття компонентів на частини

Не бійтеся розбивати компоненти на дрібніші компоненти.

Наприклад, розглянемо компонент Comment :

function Comment(props)  return ( div className="Comment"> div className="UserInfo"> img className="Avatar" src=props.author.avatarUrl> alt=props.author.name> /> div className="UserInfo-name"> props.author.name> div> div> div className="Comment-text"> props.text> div> div className="Comment-date"> formatDate(props.date)> div> div> ); >

Він приймає author (об’єкт), text (рядок) і date (дату) як пропси і представляє собою коментар в соціальній мережі.

З цим компонентом можуть виникнути складнощі у випадку зміни вкладених елементів. Також важко повторно використовувати окремі його частини. Давайте виокремимо з нього кілька компонентів.

По-перше, створимо компонент Avatar :

function Avatar(props)  return ( img className="Avatar" src=props.user.avatarUrl> alt=props.user.name> /> ); >

Компонент Avatar не повинен знати, що він рендериться всередині компонента Comment . Ось чому ми дали нашому пропсу більш загальну назву: user , а не author .

Ми рекомендуємо називати пропси з точки зору компонента, а не з контексту, в якому вони використовуються.

Тепер ми можемо спростити і зменшити Comment :

function Comment(props)  return ( div className="Comment"> div className="UserInfo"> Avatar user=props.author> />  div className="UserInfo-name"> props.author.name> div> div> div className="Comment-text"> props.text> div> div className="Comment-date"> formatDate(props.date)> div> div> ); >

Далі ми виокремимо компонент UserInfo , який відрендерить Avatar поруч з ім’ям користувача:

function UserInfo(props)  return ( div className="UserInfo">  Avatar user=props.user> />  div className="UserInfo-name">  props.user.name>  div>  div> ); >

Це дозволить нам ще більше спростити Comment :

function Comment(props)  return ( div className="Comment"> UserInfo user=props.author> />  div className="Comment-text"> props.text> div> div className="Comment-date"> formatDate(props.date)> div> div> ); >

Розбиття компонентів може здатися спочатку невдячною роботою. Проте, у великих додатках така велика кількість багаторазових компонентів є дуже корисною. Суть в тому, що якщо частина вашого інтерфейсу використовується кілька разів ( Button , Panel , Avatar ), або сама собою досить складна ( App , FeedStory , Comment ), краще винести її в окремий компонент.

Пропси можна тільки читати

Незалежно від того як ви оголосите компонент як функцію чи клас, він ніколи не повинен змінювати свої власні пропси. Розглянемо функцію sum :

function sum(a, b)  return a + b; >

Такі функції називаються “чистими”, оскільки вони не намагаються змінити свої аргументи і завжди повертають один і той же результат для тих же аргументів.

Для порівняння, наступна функція нечиста, оскільки вона змінює свої власні аргументи:

function withdraw(account, amount)  account.total -= amount; >

React досить гнучкий, але має одне суворе правило:

Всі React-компоненти повинні працювати як чисті функції відносно їхніх пропсів.

Звичайно, інтерфейси користувачів в додатках динамічні і змінюються з часом. У наступному розділі ми представимо нову концепцію “станів”. Стан дозволяє React-компонентам змінювати їхній вивід кожного разу у відповідь на дії користувача, відповіді мережі та всього іншого, не порушуючи цього правила.

Передача функцій компонентам

Передавайте обробник події та інші функції через пропси дочірнім компонентам:

button onClick=this.handleClick>>

Якщо ви хочете отримати доступ до батьківського компонента через обробник, вам потрібно прив’язати функцію до екземпляру компонента (див. нижче).

Як прив’язати функцію до екземпляру компонента?

У залежності від того, який синтаксис і підхід до створення компонентів ви використовуєте, існує декілька способів впевнитись, що функції мають доступ до таких атрибутів компонента, як this.props та this.state .

Прив’язка в конструкторі (ES2015)

class Foo extends Component  constructor(props)  super(props); this.handleClick = this.handleClick.bind(this); > handleClick()  console.log('Натискання відбулось'); > render()  return button onClick=this.handleClick>>Натисни менеbutton>; > >

Прив’язка у властивостях класу (пропозиція-кандидат)

class Foo extends Component  handleClick = () =>  console.log('Натискання відбулось'); >; render()  return button onClick=this.handleClick>>Натисни менеbutton>; > >

Прив’язка в методі render()

class Foo extends Component  handleClick()  console.log('Натискання відбулось'); > render()  return button onClick=this.handleClick.bind(this)>>Натисни менеbutton>; > >

Примітка:

Використання Function.prototype.bind у render() створює нову функцію при кожному рендері компонента, що може вплинути на продуктивність (див. нижче).

Стрілкова функція у render()

class Foo extends Component  handleClick()  console.log('Натискання відбулось'); > render()  return button onClick=() => this.handleClick()>>Натисни менеbutton>; > >

Примітка:

Використання стрілкової функції створює нову функцію при кожному рендері компонента, що може порушувати оптимізації, які використовують суворе порівняння для визначення ідентичності.

Чи можна використовувати стрілкові функції у методі render()?

Загалом, так. Зазвичай це найпростіший спосіб передати параметри через функції зворотнього виклику.

Якщо у вас виникли проблеми з продуктивністю — оптимізуйте!

Навіщо взагалі потрібна прив’язка?

У JavaScript наступні фрагменти коду не рівноцінні:

var method = obj.method; method();

Прив’язка гарантує, що другий фрагмент працюватиме так само, як і перший.

У React, як правило, слід прив’язувати тільки ті методи, які ви плануєте передати іншим компонентам. Наприклад, > передає this.handleClick , тому його слід прив’язати. Утім, метод render та методи життєвого циклу прив’язувати не обов’язково, так як ми не передаємо їх через інші компоненти.

Ознайомтесь зі статтею Єхуди Катц, у якій більш детально пояснюється, що таке прив’язка і як працюють функції в JavaScript.

Чому моя функція викликається кожного разу при рендері компонента?

Впевніться, що ви не викликаєте функцію, коли передаєте її компоненту:

render()  // Неправильно: замість посилання функція handleClick була викликана! return button onClick=this.handleClick()>>Натисни менеbutton> >

Замість цього передайте саму функцію (без дужок):

render()  // Правильно: handleClick передається як посилання! return button onClick=this.handleClick>>Натисни менеbutton> >

Як передати параметри до обробника події чи функції зворотнього виклику?

Щоб передати параметри до обробника події, обгорніть його у стрілкову функцію:

button onClick=() => this.handleClick(id)> />

Дана дія рівноцінна до використання .bind :

button onClick=this.handleClick.bind(this, id)> />

Приклад: Передача параметрів з використанням стрілкових функцій

const A = 65 // ASCII-код символу class Alphabet extends React.Component  constructor(props)  super(props); this.state =  justClicked: null, letters: Array.from(length: 26>, (_, i) => String.fromCharCode(A + i)) >; > handleClick(letter)  this.setState( justClicked: letter >); > render()  return ( div> Натиснута літера: this.state.justClicked> ul> this.state.letters.map(letter => li key=letter> onClick=() => this.handleClick(letter)>> letter> li> )> ul> div> ) > >

Приклад: Передача параметрів з використанням атрибутів даних

Як альтернативу, ви можете використовувати DOM API для збереження даних, необхідних обробникам подій. Розгляньте цей підхід, якщо вам потрібно оптимізувати велику кількість елементів чи використати дерево візуалізації, що покладається на React.PureComponent для перевірки на рівність.

const A = 65 // AASCII-код символу class Alphabet extends React.Component  constructor(props)  super(props); this.handleClick = this.handleClick.bind(this); this.state =  justClicked: null, letters: Array.from(length: 26>, (_, i) => String.fromCharCode(A + i)) >; > handleClick(e)  this.setState( justClicked: e.target.dataset.letter >); > render()  return ( div> Натиснута літера: this.state.justClicked> ul> this.state.letters.map(letter => li key=letter> data-letter=letter> onClick=this.handleClick>> letter> li> )> ul> div> ) > >

Як попередити занадто швидкий чи занадто частий виклик функції?

Якщо ви використовуєте обробники подій, такі як onClick чи onScroll , і хочете попередити швидке спрацьовування функцій зворотнього виклику, ви можете обмежити швидкість виконання даної функції. Для цього ви можете використати:

  • тротлінг (throttling): вибіркові зміни, залежні від частоти, що базується на часі (напр. _.throttle )
  • дебаунсинг (debouncing): зміни, задіяні після певного періоду бездіяльності (напр. _.debounce )
  • тротлінг за допомогою requestAnimationFrame : вибіркові зміни, засновані на requestAnimationFrame (напр. raf-schd )

Погляньте на візуалізацію, що порівнює функції throttle та debounce .

Примітка:

_.debounce , _.throttle та raf-schd передбачають метод cancel для скасування відкладених функцій зворотнього виклику. Вам потрібно або викликати цей метод з componentWillUnmount , або впевнитись, що компонент все ще примонтований у межах функції зворотнього виклику.

Тротлінг запобігає повторному виклику функції у заданий проміжок часу. Цей метод використовується у прикладі нижче, щоб не допустити виклик обробника “click” частіше, ніж раз у секунду.

import throttle from 'lodash.throttle'; class LoadMoreButton extends React.Component  constructor(props)  super(props); this.handleClick = this.handleClick.bind(this); this.handleClickThrottled = throttle(this.handleClick, 1000); > componentWillUnmount()  this.handleClickThrottled.cancel(); > render()  return button onClick=this.handleClickThrottled>>Завантажити більшеbutton>; > handleClick()  this.props.loadMore(); > >

Дебаунсинг гарантує, що функція не буде виконуватись доти, доки не пройде певна кількість часу з моменту її останнього виклику. Цей метод стане у нагоді, якщо вам потрібно провести ресурсомісткий розрахунок у відповідь на подію, яка може швидко повторитися (наприклад, прокрутка сторінки чи натиснення клавіш). У прикладі нижче для введення тексту використовується затримка у 250 мс.

import debounce from 'lodash.debounce'; class Searchbox extends React.Component  constructor(props)  super(props); this.handleChange = this.handleChange.bind(this); this.emitChangeDebounced = debounce(this.emitChange, 250); > componentWillUnmount()  this.emitChangeDebounced.cancel(); > render()  return ( input type="text" onChange=this.handleChange> placeholder="Пошук. " defaultValue=this.props.value> /> ); > handleChange(e)  this.emitChangeDebounced(e.target.value); > emitChange(value)  this.props.onChange(value); > >

requestAnimationFrame — це спосіб організації черги функції, що буде виконуватись у браузері у найоптимальніший проміжок часу для продуктивності рендерингу. Функція, поставлена в чергу за допомогою requestAnimationFrame , запуститься в наступному кадрі. Браузер докладе усіх зусиль, щоб забезпечити 60 кадрів у секунду (60 fps — frames per second). Однак, якщо браузер не в змозі справитися з цією задачею, він звичним способом обмежить кількість кадрів у секунду. Наприклад, якщо ваш пристрій підтримує тільки 30 fps, то і отримаєте ви тільки 30 кадрів. Використання requestAnimationFrame для тротлінгу є дуже корисним методом, так як він допомагає запобігти виконанню більше 60 оновлень у секунду. Якщо ви виконуєте 100 оновлень у секунду, це створює зайву роботу для браузера, яку користувач усе одно не помітить.

Примітка:

Використання даної техніки захопить тільке останнє опубліковане значення в кадрі. Приклад роботи даної оптимізації ви можете знайти на сайті MDN

import rafSchedule from 'raf-schd'; class ScrollListener extends React.Component  constructor(props)  super(props); this.handleScroll = this.handleScroll.bind(this); // Створюємо нову функцію для планування оновлень. this.scheduleUpdate = rafSchedule( point => this.props.onScroll(point) ); > handleScroll(e)  // Призначаємо оновлення при активізації події прокрутки. // Якщо у рамках кадру ми отримуємо забагато оновлень, публікуємо тільки останнє значення. this.scheduleUpdate( x: e.clientX, y: e.clientY >); > componentWillUnmount()  // Відміняємо будь-які очікуючі оновлення, так як компонент буде демонтовано. this.scheduleUpdate.cancel(); > render()  return ( div style= overflow: 'scroll' >> onScroll=this.handleScroll> > img src="/my-huge-image.jpg" /> div> ); > >

Тестування обмеження швидкості

Коли тестування показує, що ваш код обмеження швидкості працює правильно, корисно мати можливість прокрутити час. Якщо ви використовуєте jest , вам може знадобитися mock timers . Якщо ви використовуєте requestAnimationFrame , то raf-stub може виявитися корисним інструментом для керування зміною кадрів анімації.

Як налаштувати додаткові компоненти в Windows 10

У Windows 10 є безліч різних компонентів, які Ви можете включати або відключати через панель управління. Деякі з них призначені для серверів, проте частина стане в нагоді і звичайним користувачам. У цій статті ми розглянемо, що з себе представляє кожен з цих компонентів.

Зміст:

Як подивитися додаткові компоненти в Windows 10, а також включити, або відключити їх через Панель Управління

Як подивитися додаткові компоненти в Windows 10, а також включити, або відключити їх через Панель Управління

Для того, щоб дістатися до додаткових компонентів Windows через Панель Управління, виконайте наступні кроки:

  1. Запустіть Панель Управління (натиснувши на «Пуск» правою кнопкою миші і вибравши «Панель Управління», або скориставшись пошуком);
  2. Виберіть розділ «Програми та засоби»;
  3. Виберіть пункт «Включення або відключення компонентів Windows», який розташований в лівій частині вікна;
  1. Перед вами відкриється вікно «Компоненти Windows»;
  2. У вікні, Ви побачите доступні функції. Ті з них, на яких стоять галочки – включені, ті, що без галочок – вимкнені;
  1. Якщо перед компонентом Ви бачите квадрат, ліворуч від якого розташований «+», це означає, що він містить додаткові параметри, і можна включити як весь цей компонент, так і частину його функцій. Натиснувши на «+», Ви зможете побачити список додаткових параметрів компонента. Щоб включити компонент – необхідно поставити перед ним галочку, щоб вимкнути – зняти галочку, після чого натиснути «ОК»;

Додаткові компоненти, доступні у Windows 10

Додаткові компоненти, доступні в Windows 10, будуть залежати від того, яка версія операційної системи встановлена ​​на вашому комп’ютері. Наприклад, якщо Ви є користувачем Windows 10 Home, деякі додаткові компоненти вам будуть недоступні.

На скріншоті нижче Ви можете побачити різницю в кількості додаткових компонентів в Windows 10 Home, і Windows 10 Pro.

У цій статті ми розглянемо більш повний набір додаткових компонентів, який доступний в професійній версії Windows 10:

  1. .NET Framework 3.5 (включає .NET 2.0 і 3.0): даний компонент необхідний для запуску додатків, які написані на даних версіях .NET. Якщо цей компонент буде потрібен додатку, операційна система автоматично встановить його;
  2. .NET Framework 4.6 Advanced Services: не менш важливий компонент для запуску додатків. Даний компонент також буде автоматично встановлений в разі потреби;
  3. Hyper-V: інструмент для віртуалізації від Microsoft. Цей компонент містить основну платформу, а також засоби управління, і використання віртуальних машин;
  4. Internet Explorer 11: якщо Ви не плануєте використовувати застарілий браузер Internet Explorer – Ви можете його повністю відключити;
  5. SNMP-протокол: старий протокол для управління комутаторами, маршрутизаторами, а також іншими мережевими пристроями. Даний компонент стане в нагоді користувачам, які ще працюють в середовищі, що використовує цей старий протокол;
  6. Windows Identity Foundation 3.5: даний компонент можуть використовувати старі додатки NET. Якщо якийсь додаток буде вимагати від вас наявність даного компонента – поставте галочку і увімкніть його;
  7. Windows PowerShell 2.0: більш просунутий командний рядок, за допомогою якого Ви можете, наприклад, видаляти або встановлювати заново зі стандартними програмами в Windows 10. Даний компонент включений за замовчуванням, але, якщо він не використовується, його можна відключити;
  8. Впроваджуване веб-ядро служб IIS: звичайним користувачам даний компонент, як правило, не потрібен. Зазвичай він використовується IT фахівцями і розробниками програмного забезпечення;
  9. Вбудований модуль запуску оболонки: це новий компонент в Windows 10, який дозволяє додаткам працювати в безпечному ізольованому просторі, якщо вони запрограмовані на це. Звичайним користувачам даний компонент не потрібен;
  10. Клієнт Telnet: команди Telnet дозволяють віддалено підключатися до інтерфейсу командного рядка, на комп’ютерах і пристроях, які працюють під управлінням сервера Telnet. Telnet не є безпечним, тому активувати цей компонент рекомендується тільки в тому випадку, якщо в цьому дійсно є потреба;
  11. Клієнт TFTP: дозволяє за допомогою протоколу TFTP передавати файли. Даний протокол застарів, а також є небезпечним, тому може бути корисний тільки на старих пристроях;
  12. Клієнт робочих тек: цей компонент дозволяє синхронізувати теки з корпоративної мережі з вашим комп’ютером;
  13. Компоненти для роботи з мультимедіа: якщо Ви не користуєтеся для відтворення відео і аудіо програвачем Windows Media, Ви можете відключити цей компонент;
  14. Компоненти колишніх версій: раніше даний компонент був частиною DirectX, і використовувався для створення мереж і багатокористувацьких ігор.

Якщо якась стара гра запросить цей компонент при установці, операційна система Windows 10 автоматично встановить його;

  1. Пакет адміністрування диспетчера RAS- підключень: цей інструмент дозволяє створювати призначені для користувача профілі віддаленого доступу для VPN. Як правило, цей компонент використовується в корпоративних мережах IT фахівцями;
  2. Друк в PDF: додає можливість друкувати будь-який документ в PDF файл. Ви також можете об’єднати з його допомогою зображення в один PDF файл. За замовчуванням цей компонент включений, але якщо з якихось причин він вам не потрібен – зніміть галочку і натисніть «ОК»;
  3. Підтримка АРІ віддаленого розносного стиснення: алгоритм, необхідний для порівняння синхронізованих файлів. Деякі додатки можуть вимагати наявності даної функції, хоча таких додатків не багато;
  4. Підтримка загального доступу до файлів SMB 1.0 / CIFS: дозволяє здійснювати спільне використання файлів і принтерів з більш старими Windows (від 4.0 до XP). Операційні системи Linux і Mac також можуть використовувати старіший протокол SMB для спільного використання файлів і принтерів;
  5. Прослуховувач RIP: дана служба буде корисна тільки тим користувачам, у яких є маршрутизатор, який підтримує протокол RIPv1. Це може стати в нагоді в корпоративній мережі, але навряд чи знадобиться в домашніх умовах;
  6. Прості служби TCPIP: це набір додаткових мережевих послуг для усунення деяких неполадок корпоративної мережі. Звичайним користувачам цей компонент не знадобиться;
  7. Сервер черги повідомлень Майкрософт: стара послуга з відправлення повідомлень в ненадійних мережах. У разі втрати зв’язку, повідомлення зберігаються в буфері і відправляються відразу після її відновлення. Ця функція необхідна для коректної роботи деяких корпоративних додатків;
  8. Служба активації Windows: дана функція може стати в нагоді тільки розробникам програмного забезпечення. Цей компонент пов’язаний з Internet Information Services (IIS);
  9. Служби Active Directory для полегшеного доступу до каталогів: забезпечує сервер LDAP (Lightweight Directory Access Protocol). Він працює як служба Windows і надає каталог для аутентифікації користувачів в мережі. Це альтернатива повного сервера Active Directory, яка буде корисна тільки в деяких корпоративних мережах;
  10. Служби IIS: надає веб і FTP – сервери IIS від Microsoft разом з інструментами для управління серверами;
  11. Служби XPS: дозволяє друкувати XPS документи. Майкрософт створив цей формат документа ще в операційній системі Windows Vista, хоча більшість користувачів користується печаткою в PDF. Відключивши даний компонент, ви знищите даний принтер;
  12. Служби друку документів: клієнт друку через Інтернет і Windows, функції факсу та сканування включені за замовчуванням. Вони дозволяють сканувати через мережу, друкувати і відправляти факси. Можна також додати підтримку протоколів друку LPD і LPR мережі, хоча вони старше і потрібні не так часто, тільки якщо у вас є підключення до мережевого принтера, яким вони потрібні;
  13. З’єднувач MultiPoint: дозволяє комп’ютеру здійснювати моніторинг і управління за допомогою MultiPoint Manager, і панелі додатків. Це корисно тільки в корпоративних мережах, і тільки якщо ці мережі використовують дані інструменти управління;
  14. Засіб перегляду XPS: додаток, що дозволяє переглядати XPS – документи;
  15. Фільтр Windows TIFF IFilter: функція, що дозволяє активувати служби індексування Windows, щоб проаналізувати .TIFF файли і виконати оптичне розпізнавання символів (OCR). Даний компонент за замовчуванням відключений тому, що це інтенсивний процес, який створює навантаження. Але, якщо Ви використовуєте багато TIFF – файлів (наприклад, якщо Ви регулярно скануєте паперові документи в TIFF, це може бути корисна функція, яка полегшує пошук цих відсканованих документів.

Як подивитися додаткові компоненти в Windows 10, а також включити, або відключити їх, використовуючи вікно «Параметри»

У Windows 10 деякі налаштування були переміщені з Панелі Управління в «Параметри». Для того, щоб отримати до них доступ, виконайте наступні кроки:

  1. Відкрийте «Параметри» (відповідна кнопка розташована в лівому нижньому кутку меню «Пуск» над кнопкою виключення »;
  2. Виберіть розділ «Система»;
  3. Виберіть пункт «Додатки та можливості»;
  1. Натисніть на рядок «Управління додатковими компонентами»;
  2. Виберіть потрібний вам компонент, натисніть на нього і Ви побачите кнопку «Видалити»;
  1. Ви також можете вибрати пункт «Додати компонент», після чого система запропонує вам додати додаткові шрифти для деяких мов.

Висновок

Перераховані вище компоненти займають місце на жорсткому диску навіть в тому випадку, якщо вони відключені. Ми не рекомендуємо вам включати всі з них тому, що деякі з компонентів можуть знизити продуктивність системи, або привести до проблем, пов’язаних з безпекою.

А які додаткові компоненти в Windows 10 включили Ви? Дайте нам знати про це в коментарях.