рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЕрдЪреНрдЫрд╛ рдмрдирд╛рддрд╛ рд╣реИ?

рдпрд╣ рдкреЛрд╕реНрдЯ рдСрдЯреЛ-рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рджреВрд╕рд░рд╛ рд╣реИ - Ember.js рдореЗрдВ рдирдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реАред рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред


рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдХреНрд░рд┐рд╕ рдЧреИрд░реЗрдЯ - рд▓рд┐рдВрдХреНрдбрдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдореНрдмрд░ рдЬреЗрдПрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рдореБрдЦреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг - рдПрдореНрдмрд░ рдСрдХреНрдЯреЗрди рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рднрд╛рдЧ рд▓рд┐рдпрд╛ ред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХреЛрдиреЗрд╕реНрдЯреЛрди рдореЗрдВ рд╕реЗ рдПрдХ рдСрдЯреЛрдореИрдЯрд┐рдХ рдЯреНрд░реИрдХрд┐рдВрдЧ (рдСрдЯреЛрдЯреНрд░реИрдХрд┐рдВрдЧ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирдпрд╛ рд░рд┐рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрдирдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдореНрдмрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рдереА, рдпрд╣ рдЙрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдЫреВрддреА рд╣реИ рдЬреЛ рд╕рднреА рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВред


  1. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреНрдпрд╛ рд╣реИ?
  2. рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЕрдЪреНрдЫрд╛ рдмрдирд╛рддрд╛ рд╣реИ? тЖР рдпрд╣ рдкреЛрд╕реНрдЯ
  3. рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ
  4. рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдорд╛рдорд▓рд╛ - TrackedMap
  5. рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ - @localCopy
  6. рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗрд╕ - рд░рд┐рдореЛрдЯрдбрд╛рдЯрд╛
  7. рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ - рдкреНрд░рднрд╛рд╡ ()

, . , :


: , .

, , . : ?


, , . . , , . , , .


, , . , , . ! , , - ( ).


HTML


HTML . , , . HTML ( CSS) , - JavaScript!


-, HTML ? ? HTML :


<form action="/my-handling-form-page" method="post">
  <label>
    Email:
    <input type="email" />
  </label>

  <label>
    Password:
    <input type="password" />
  </label>

  <button type="submit">Log in</button>
</form>

. . тАФ , , - . , , .


тАЛтАЛ : , , , . HTML , , , тАФ (JavaScript). , HTML ? , HTML ?


HTML, input select. , , , . , , .


<style>
  input[type='checkbox'] + ul {
    display: none;
  }

  input[type='checkbox']:checked + ul {
    display: inherit;
  }
</style>

<nav>
  <ul>
    <li>
      <label for="dropdown">Dropdown</label>
      <input id="dropdown" type="checkbox" />
      <ul>
        <li>Item 1</li>
        <li>Item 2</li>
      </ul>
    </li>
  </ul>
</nav>

тАФ ┬л , CSS┬╗. . ./index.html - HTML / CSS .


HTML (, checked ). HTML- , . , , :


1. , , ,

, , HTML- . - , 10 , , .


. - . , JS .


push


push. , , . , JavaScript, .


. , , , , , - . , - <edit-word> :


customElements.define('edit-word',
  class extends HTMLElement {
    constructor() {
      super();

      const shadowRoot = this.attachShadow({mode: 'open'});
      this.form = document.createElement('form');
      this.input = document.createElement('input');
      this.span = document.createElement('span');

      shadowRoot.appendChild(this.form);
      shadowRoot.appendChild(this.span);

      this.isEditing = false;
      this.input.value = this.textContent;

      this.form.appendChild(this.input);

      this.addEventListener('click', () => {
        this.isEditing = true;
        this.updateDisplay();
      });

      this.form.addEventListener('submit', e => {
        this.isEditing = false;
        this.updateDisplay();
        e.preventDefault();
      });

      this.input.addEventListener('blur', () => {
        this.isEditing = false;
        this.updateDisplay();
      });

      this.updateDisplay()
    }

    updateDisplay() {
      if (this.isEditing) {
        this.span.style.display = 'none';
        this.form.style.display = 'inline-block';
        this.input.focus();
        this.input.setSelectionRange(0, this.input.value.length)
      } else {
        this.span.style.display = 'inline-block';
        this.form.style.display = 'none';
        this.span.textContent = this.input.value;
        this.input.style.width = this.span.clientWidth + 'px';
      }
    }
  }
);

- , . isEditing, updateDisplay span form . , . , updateDisplay .


, , isEditing . , . :


2.

isEditing , . , , тАФ .


, , .


Ember


Ember Classic push. (observers) (evert listeners) , , , . , (binding), (dependency chaining), .


fullName:


import { computed, set } from '@ember/object';

class Person {
  firstName = 'Liz';
  lastName = 'Hewell';

  @computed('firstName', 'lastName')
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

let liz = new Person();

console.log(liz.fullName); 'Liz Hewell';

set(liz, 'firstName', 'Elizabeth');

console.log(liz.fullName); 'Elizabeth Hewell';

Classic Ember . , , , Ember . , set(), .



, (observers) , (computed) (templates) . , , , . ( ) .


Ember , , . . , - . , , . - () тАФ , , .


, , , . , , . , , .


Observables, Streams Rx.js


push, , тАФ Observable. JavaScript RxJS Angular .


, . , , , .


//  JS
let count = 0;
document.addEventListener(
  'click',
  () => console.log(`Clicked ${++count} times`)
);

//   (Streams)
import { fromEvent } from 'rxjs';
import { scan } from 'rxjs/operators';

fromEvent(document, 'click')
  .pipe(scan(count => count + 1, 0))
  .subscribe(count => console.log(`Clicked ${count} times`));

Ember, тАФ , . , , .


, . , , , . , .



, (debounce), , . :


3.

, . , , . , , , , .


, , push, . (lazy) , , , Ember Classic, . , , push, , .


, , . pull.


pull


, , pull, тАФ . , , . , , , - , . , , , .


, , pull. , , . , .


, pull , . , ┬лVirtual DOM┬╗.


React VirtualDOM


Virtual DOM, , React.js . , HTML . , , , HTML, React , , HTML.


HTML-. , . -.



, React, , - . , setState API ( useState ).


class Toggle extends React.Component {
  state = { isToggleOn: true };

  handleClick = () => {
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

, ( ) .



, (consistency), , setState useState . , ( ). - React , :


4.

React , , . , React :


class Example extends React.Component {
  state = {
    value: 123;
  };

  render() {
    let part1 = <div>{this.state.value}</div>

    this.setState({ value: 456 });

    let part2 = <div>{this.state.value}</div>

    return (
      <div>
        {part1}
        {part2}
      </div>
    );
  }
}

, , part1 , part2 . , , - , . , , . React , .


, React , . API, shouldComponentUpdate() useMemo(), React .


API , тАЛтАЛ . , .


Vue:


Vue Virtual DOM, . Vue data :


const vm = new Vue({
  data: {
    a: 1
  }
});

Vue setState useState ( , API), . data , , . observables.


, :


const vm = new Vue({
  el: '#example',

  data: {
    message: 'Hello'
  },

  computed: {
    reversedMessage() {
      return this.message.split('').reverse().join('')
    }
  }
})

reversedMessage message , message .


Vue , React, . , (memoization) , - , . push, , .


Elm


, , JavaScript. , , (autotracking) , , - .


Elm тАФ , . , ( HTML + JS). , - .


, Elm - , . , Elm .



- Elm , (memoization). , . / , .


//     JS
let lastArgs;
let lastResult;

function memoizedRender(...args) {
  if (deepEqual(lastArgs, args)) {
    // Args
    return lastResult;
  }

  lastResult = render(...args);
  lastArgs = args;

  return lastResult;
}

┬л┬╗ , , Elm .


. , HTML , React / Vue / Virtual DOM.


, , , . Elm, , - .


, Elm JavaScript . JavaScript, , . , . Redux тАФ , , .


, , тАФ , , . , .


!



, , :


  • HTML / CSS
  • push
  • JavaScript
    тАФ Ember
    тАФ Observables / Rx.js
  • pull
    тАФ React.js
    тАФ Vue.js
    тАФ Elm

:


  1. , , ,
  2. рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡реНрдпреБрддреНрдкрдиреНрди рд░рд╛рдЬреНрдп рд╣реЛрддрд╛ рд╣реИ
  3. рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
  4. рд╕рд┐рд╕реНрдЯрдо рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ

рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдпрд╣ рд╕реВрдЪреА рд╕рдВрдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкрддрд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред


All Articles