рдЕрд▓реНрдкрд╛рдЗрдиред рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░

рдЖрдкрдиреЗ рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ "Vue.js рдиреНрдпреВрдирддрдо рдкрд░ рд╣реИред" "рдорд┐рд▓реЗрдирд┐рдпрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдгреАрдп 1ред" рдЗрд╕реЗ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдореБрдЦреНрдп рдмрд╛рдд рд╕рдордЭреЗрдВред


рд╣рдореЗрдВ рджреВрд╕рд░реЗ рдврд╛рдВрдЪреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЦреИрд░, рдЕрд▓реНрдкрд╛рдЗрди рдЕрдкрдиреЗ рдЖрд▓рд╛ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрди рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдврд╛рдВрдЪреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд╣рд╛рдВ рдЗрди рдмрдбрд╝реЗ рдврд╛рдВрдЪреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ, рдПрдХ рдЯреНрд░реЗрдВрдбреА рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░, рдПрдХ рдмрд╣реБ-рдкреГрд╖реНрда рд╕рд╛рдЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдПрдХ рдлрд╛рд░реНрдо рдкреНрд░рд╛рдердорд┐рдХ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрдВ рдХреНрдпрд╛ рдХрд░реВрдВрдЧрд╛? рдореБрдЭреЗ jQuery рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП - рджреЛрд╕реНрддреЛрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛, рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдкрд░ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рднреА il faut рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдХреЛрдгреАрдп рдФрд░ рджреГрд╢реНрдп рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛-рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реИред HTML рдореЗрдВ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдм рдореИрдВ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░реВрдВ?


рдпрд╣рд╛рдБ рдЕрд▓реНрдкрд╛рдЗрди.рдЬреЗрдПрд╕ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, Vue рдпрд╛ React рдХреЛ рдкреЗрдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдПрдХреНрдЯ рдЙрдирдХреЗ рд╕рд╣реА рджрд┐рдорд╛рдЧ рдореЗрдВ рдХреЛрдИ рднреА рдирд╣реАрдВ рд▓рд┐рдЦреЗрдЧрд╛, рдФрд░ рд╕реАрдбреАрдПрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдЗрди рдХрд┐рдП рдЧрдП рд╡реАрдпреВ рдХрд╛ рд╡рдЬрди 34 рдХреЗрдмреА (рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рд▓рд┐рдП 8.1 рдХреЗрдмреА) рд╣реЛрддрд╛ рд╣реИред рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЪреБрдирд╛рд╡ рдЕрд▓реНрдкрд╛рдЗрди рдкрд░ рдкрдбрд╝рддрд╛ рд╣реИред


рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдпрд╣рд╛рдБ рд╣реИрдмреЗ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд▓реНрдкрд╛рдЗрди.рдЬреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рд▓реЗрдЦ рдереЗ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рд╕рд╛рдЗрдЯ рдиреЗ рд╣рд░ рдЬрдЧрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреИрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛рдЯ рджрд┐рдП, рд▓реЗрдЦ рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рдирд┐рдХрд▓реЗред


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


рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ Vue рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ Vue рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдкреНрд░рдореБрдЦ рдЕрдВрддрд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг:


  • рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо v-рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ x-, рдЕрд░реНрдерд╛рддреНред рдирд╣реАрдВ v-model, рд▓реЗрдХрд┐рди x-model; рдирд╣реАрдВ v-bind, рд▓реЗрдХрд┐рди x-bindрдХреНрдпреЛрдВ? рдпрд╣ рдЖрдкрдХрд╛ рд╣реЛрдорд╡рд░реНрдХ рд╣реИ :)
  • x-if x-for template. Virtual DOM.
  • {{}} . x-text x-html, Vue.

.


, . . - ? тАУ . тАУ , , . тАУ " , " .. ..


, , .


HTML, CDN Alpine


<!DOCTYPE html>
<html lang="ru">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>To-Do  Alpine.js</title>
    <script
      src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.3.5/dist/alpine.min.js"
      defer
    ></script>
  </head>
  <body></body>
</html>

Alpine , . .


, ? . x-data.


<div x-data="{ name: '' }">
  <p>, <span x-text="name"></span></p>
</div>

<div> , . name <div> .


, to-do. :


<div
  x-data="{ todos: [{id: 1, title: ' ', completed: false}, {id: 2, title: ' ', completed: false}, {id: 3, title: '  ', completed: false}, {id: 4, title: '  ', completed: false}] }"
>
  <h1>  :</h1>
  <ul>
    <template x-for="todo in todos" :key="todo.id">
      <li x-text="todo.title"></li>
    </template>
  </ul>
</div>

. , , CSS- .completed, x-bind:class ( {[ ]: []}). cursor: pointer li, .


<style>
  .completed {
    text-decoration: line-through;
  }

  li {
    cursor: pointer;
  }
</style>

<div
  x-data="{ todos: [{id: 1, title: ' ', completed: false}, {id: 2, title: ' ', completed: false}, {id: 3, title: '  ', completed: false}, {id: 4, title: '  ', completed: false}], toggleTodo: function(id) { var todo = this.todos.find((todo) => todo.id === id); todo.completed = !todo.completed; } }"
>
  <h1>  :</h1>
  <ul>
    <template x-for="todo in todos" :key="todo.id">
      <li
        x-text="todo.title"
        @click="toggleTodo(todo.id)"
        :class="{'completed': todo.completed}"
      ></li>
    </template>
  </ul>
</div>

, , . , x-data :


<div x-data="todos()">
  <h1>  :</h1>
  <ul>
    <template x-for="todo in todos" :key="todo.id">
      <li
        x-text="todo.title"
        @click="toggleTodo(todo.id)"
        :class="{'completed': todo.completed}"
      ></li>
    </template>
  </ul>
</div>

<script>
  function todos() {
    return {
      todos: [
        { id: 1, title: ' ', completed: false },
        { id: 2, title: ' ', completed: false },
        { id: 3, title: '  ', completed: false },
        { id: 4, title: '  ', completed: false },
      ],
      toggleTodo: function (id) {
        var todo = this.todos.find((todo) => todo.id === id);
        todo.completed = !todo.completed;
      },
    };
  }
</script>

тАж Vue.


input :


<div x-data="todos()">
  <!-- ... -->
  <div>
    <h4>  :</h4>
    <input type="text" x-model="inputValue" />
    <button @click="addTodo()"></button>
  </div>
</div>

<script>
  function todos() {
    return {
      // ...
      inputValue: '',
      addTodo: function () {
        if (!this.inputValue) {
          return;
        }

        this.todos.push({
          id: Date.now(),
          title: this.inputValue,
          completed: false,
        });
        this.inputValue = '';
      },
    };
  }
</script>

push() , Alpine , - .


тАУ . <li> span: , тАУ .


<ul>
  <template x-for="todo in todos" :key="todo.id">
    <li @click="toggleTodo(todo.id)" :class="{'completed': todo.completed}">
      <span x-text="todo.title"></span>
      <span @click="deleteTodo(todo.id)">&times;</span>
    </li>
  </template>
</ul>

<script>
  function todos() {
    return {
      // ...
      deleteTodo: function (id) {
        this.todos = this.todos.filter((todo) => todo.id !== id);
      },
    };
  }
</script>

.


, , , REST API. , JSON Placeholder. x-init.


<div x-data="todos()" x-init="fetchTodos()">
  <!-- ... -->
</div>

<script>
  function todos() {
    return {
      // ...
      todos: [],
      fetchTodos: function () {
        fetch('https://jsonplaceholder.typicode.com/todos')
          .then((response) => response.json())
          .then((data) => {
            this.todos = data.slice(0, 10);
          });
      },
    };
  }
</script>

x-init DOM ( created Vue). тАУ , ( mounted).
, ?_limit=10, query , , .


. Alpine.js. . , . , , .


sandbox. , , .


рдкреАрдПрд╕ рдЗрдВрдЧреНрд▓рд┐рд╢ рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рднреА рдПрд▓реНрдкрд╛рдЗрди.рдЬреЗрдПрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ "рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрдХреНрдд" рд╕реНрдХреНрд░реИрдВрдХреЗрд╕реНрдЯ рдХреЛ рд╕рд▓рд╛рд╣ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдПрдХ рд▓рд┐рдВрдХ рднреА рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрдпрд╛ рд╣реИред рддреЛ рдареАрдХ рд╣реИ ред рдЗрд╕рдореЗрдВ, рд▓реЗрдЦрдХ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕рд╛ рдврд╛рдВрдЪрд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред

All Articles