تيك تاك تو الجزء 0: مقارنة Svelte والتفاعل

تيك تاك تو الجزء 0: مقارنة Svelte والتفاعل
تيك تاك تو الجزء 1: Svelte و Canvas 2D
تيك تاك تو الجزء 2: عديمي الجنسية التراجع / الإعادة
تيك تاك تو ، الجزء 3: تراجع / الإعادة مع تخزين الأوامر
تيك تاك تو الجزء 4: التفاعل مع القارورة الخلفية باستخدام HTTP

يوجد برنامج تعليمي على موقع React'a يصف تطور اللعبة Tic Tac Toe. قررت أن أكرر تطوير هذه اللعبة على Svelte. تغطي المقالة فقط النصف الأول من البرنامج التعليمي ، قبل تنفيذ تاريخ التحركات. لأغراض التعريف بالإطار ، هذا يكفي تمامًا. يتوافق كل قسم من المقالة مع قسم البرنامج التعليمي ، ويحتوي على روابط إلى الكود المصدري لكلا الإطارين.


فحص كود البداية

رد - Svelte


App.svelte
<script> import Board from './Board.svelte'; </script> <div class="game"> <div class="game-board"> <Board /> </div> <div class="game-info"> <div></div> <ol></ol> </div> </div> <style> .game { font: 14px "Century Gothic", Futura, sans-serif; margin: 20px; display: flex; flex-direction: row; } .game-info { margin-left: 20px; } ol { padding-left: 30px; } </style> 

Board.svelte
 <script> import Square from './Square.svelte'; </script> <div class="status">Next player: X</div> <div class="board"> {#each Array(9) as square} <Square /> {/each} </div> <style> .board { width: 102px; } .status { margin-bottom: 10px; } </style> 

Square.svelte
 <button></button> <style> button { background: #fff; border: 1px solid #999; float: left; font-size: 24px; font-weight: bold; line-height: 34px; height: 34px; margin-right: -1px; margin-top: -1px; margin-bottom: -1px; padding: 0; text-align: center; width: 34px; } button:focus { outline: none; } </style> 

يتم تنفيذ كل مكون في ملف منفصل. يمكن أن يحتوي المكون على أنماط للشفرة وترميز HTML و CSS. يظهر استخدام المكونات المتداخلة : يتم استيراد مكون Square في مكون اللوحة ، ويتم استيراد مكون اللوحة إلى مكون التطبيق. أظهرت تستخدم كل كتلة في مكون المجلس. نادراً ما تتغير الأنماط ، لذلك قمت بوضعها بعد ترميز HTML ، حتى لا تقلبها مرة أخرى.


تمرير البيانات من خلال الدعائم

رد - Svelte
ساحة تعلن قيمة الممتلكات .


 <script> export let value = ''; </script> <button>{value}</button> 

يُظهر اللوحة استخدام مؤشرات الصفيف لتجميع الخلايا.


 <div class="board"> {#each Array(9) as square, i} <Square value={i}/> {/each} </div> 

صنع مكون تفاعلي

رد - Svelte
بالنقر فوق الخلية ، يظهر تقاطع. أضاف مربع DOM معالج الأحداث DOM لنقرات الماوس. متغير الحالة المضافة لعرض تقاطع في خلية.


 <script> export let value = ''; let state = ''; function handleClick() { state = 'X'; } </script> <button on:click={handleClick}> {state} </button> 

رفع الدولة تصل

رد - Svelte
حتى تلك اللحظة ، تم تخزين حالة الخلايا فيها. الآن تم نقل تخزين حالة اللعبة إلى مكون اللوحة ، يتم تخزين حالة جميع الخلايا في صفيف واحد. كما تم نقل معالج النقر clickClick إلى مكون اللوحة. يعرض المربع الآن حالة الخلية مرة أخرى باستخدام خاصية القيمة.


Board.svelte
 <script> import Square from './Square.svelte'; let state = { squares: Array(9).fill(''), }; function handleClick(i) { const squares = state.squares.slice(); squares[i] = 'X'; state.squares = squares; } </script> <div class="status">Next player: X</div> <div class="board"> {#each state.squares as value, i} <Square {value} on:click={e => handleClick(i)}/> {/each} </div> 

Square.svelte
 <script> export let value = ''; </script> <button on:click> {value} </button> 

يتناوبون

رد - Svelte
وأضاف ظهور إصبع القدم بعد الصليب.


Board.svelte
 <script> import Square from './Square.svelte'; let state = { squares: Array(9).fill(''), xIsNext: true, }; function handleClick(i) { const squares = state.squares.slice(); squares[i] = state.xIsNext ? 'X' : 'O'; state.squares = squares; state.xIsNext = !state.xIsNext; } </script> <div class="status">Next player: {state.xIsNext ? 'X' : 'O'}</div> <div class="board"> {#each state.squares as value, i} <Square {value} on:click={e => handleClick(i)}/> {/each} </div> 

إعلان الفائز

رد - Svelte
تمت إضافة وظيفة لتحديد الفائز calculateWinner في ملف منفصل helper.js. يحظر النقر فوق الخلايا الموجودة بالفعل بعد النصر.


heplers.js
 export function calculateWinner(squares) { const lines = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6], ]; for (let i = 0; i < lines.length; i++) { const [a, b, c] = lines[i]; if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) { return squares[a]; } } return null; } 

Board.svelte
 <script> import Square from './Square.svelte'; import { calculateWinner } from './helpers.js'; let state = { squares: Array(9).fill(''), xIsNext: true, }; $: winner = calculateWinner(state.squares); function handleClick(i) { if (winner || state.squares[i]) return; const squares = state.squares.slice(); squares[i] = state.xIsNext ? 'X' : 'O'; state.squares = squares; state.xIsNext = !state.xIsNext; } </script> <div class="status"> {#if winner} <b>Winner: {winner}</b> {:else} Next player: {state.xIsNext ? 'X' : 'O'} {/if} </div> <div class="board"> {#each state.squares as value, i} <Square {value} on:click={e => handleClick(i)} /> {/each} </div> 

لم أعد أخطط للذهاب إلى البرنامج التعليمي ، لقد تعرفت على الإطار.


مستودع جيثب

https://github.com/nomhoi/tic-tac-toe


تثبيت اللعبة على الكمبيوتر المحلي:


 git clone git@github.com:nomhoi/tic-tac-toe.git cd tic-tac-toe npm install npm run dev 

نطلق اللعبة في متصفح على العنوان: http: // localhost: 5000 / .


استكمال: المادة الثابتة ورمز المصدر وفقا للتعليقات في التعليقات.


UPDATE2: وأضاف مستودع تعليمي على جيثب.

Source: https://habr.com/ru/post/ar456474/


All Articles