es
Feedback
ToCode

ToCode

Ir al canal en Telegram

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Mostrar mรกs
1 419
Suscriptores
Sin datos24 horas
-17 dรญas
Sin datos30 dรญas
Archivo de publicaciones
ToCode
1 419
# ื”ืื‘ืกื•ืจื“ ืฉืœ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื ื’ื™ืฉื•ืช ืžื—ื•ืฅ ืœืขื•ืœื ื”ื˜ื›ื ื™ ืฉืœ ื ื’ื™ืฉื•ืช ืืชืจื™ื, ืืคืฉืจ ืœื“ื‘ืจ ืขืœ ืคืจื™ื™ืžื•ื•ืจืง "ื ื’ื™ืฉ" ื‘ืชื•ืจ ืคืจื™ื™ืžื•ื•ืจืง ืฉืงืœ ืœืืžืฅ ืื•ืชื•, ืžืฉื”ื• ืฉื”ื•ื ื ื’ื™ืฉ ืขื‘ื•ืจื ื•. ื™ืฉ ื›ืœ ืžื™ื ื™ ืžืืคื™ื™ื ื™ื ืฉื”ื•ืคื›ื™ื ืกืคืจื™ื” ืื• ืคืจื™ื™ืžื•ื•ืจืง ืœื ื’ื™ืฉื™ื- ืชืงื•ืคื” ืืจื•ื›ื” PHP ื”ื™ื” ื ื’ื™ืฉ ื›ื™ ืžืกืคื™ืง ื”ื™ื” ืœืฉื™ื ืงื•ื‘ืฅ PHP ืขืœ ื”ืฉืจืช ื›ื“ื™ ืœืงื‘ืœ ืืชืจ ื“ื™ื ืžื™ (ื‘ื ื™ื’ื•ื“ ืœ setup ื”ืžืกื•ืจื‘ืœ ืฉืœ CGI Scripts ืฉื”ื™ื• ืœืคื ื™ื•). jQuery ื”ื™ื” ื ื’ื™ืฉ ื›ื™ ื”ื™ื” ืžืื•ื“ ืงืœ ืœืžืชื›ื ืชื™ื ืœื”ื‘ื™ืŸ ืื™ืš ืœื”ืฉืชืžืฉ ื‘ื• ื•ืœื‘ื ื•ืช ืงื•ื“ ืฉืขื•ื‘ื“. ืจื™ื™ืœืก ื‘ 2005 ื”ื™ื” ืžืื•ื“ ื ื’ื™ืฉ ื›ื™ ื”ื•ื ื“ื™ื‘ืจ ืœืื•ืชื ืžืื•ื›ื–ื‘ื™ PHP ืฉื—ื™ืคืฉื• ื™ื•ืชืจ ืกื“ืจ ื‘ืงื•ื“ ืฉืœื”ื, ืื‘ืœ ืœื ื”ืจื’ื™ืฉื• ื‘ื ื•ื— ืœืขื‘ื•ืจ ืœ Java ืื• .NET, ืื ื’ื•ืœืจ1 ื”ื™ื” ื™ื•ืชืจ ื ื’ื™ืฉ ืž Backbone ื• Ember ืœืžืชื›ื ืชื™ Backend ื›ื™ ื”ื•ื ืื™ืคืฉืจ ืœื”ื "ืœื“ืœื’" ืขืœ ืœื™ืžื•ื“ ืขื•ืœื ื” Front End ื•ืœื›ืชื•ื‘ ื“ื‘ืจื™ื ืกื‘ื™ืจื™ื ื‘ืœื™ ืœื”ื‘ื™ืŸ ืืช ื”ืžื›ื ื™ืงื” ืฉืžืชื—ืช, ื•ื”ื™ื•ื Vue ื™ื•ืชืจ ื ื’ื™ืฉ ืž React ืื• Angular ืžืกื™ื‘ื•ืช ื“ื•ืžื•ืช. ื”ืื‘ืกื•ืจื“ ื”ื•ื ืฉื›ืžืขื˜ ืœื›ืœ ื˜ื›ื ื•ืœื•ื’ื™ื” ื ื’ื™ืฉื” ืžื’ื™ืข ื‘ืกื•ืฃ ืจื’ืข "ื”ื”ืชืคื›ื—ื•ืช", ืฉื‘ื• ืื ื—ื ื• ืžื‘ื™ื ื™ื ืฉืจืง ื‘ื’ืœืœ ืฉื”ื™ื” ืงืœ ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” ืžืกื•ื™ืžืช ืœื ื‘ื”ื›ืจื— ื”ื•ืคืš ืื•ืชื” ืœื˜ื•ื‘ื”. ื‘ Angular1 ื–ื” ื”ื™ื” ืขื ื”ืคื•ืคื•ืœืจื™ื•ืช ืฉืœ ื’'ื•ืŸ ืคืืคื ื•ื” Style Guide ื”ืžืคื•ืจืกื ืฉืœื•. ืจื™ื™ืœืก ื”ืคื›ื” ืœืžืกื•ืจื‘ืœืช ื‘ืื–ื•ืจ 2010 ื›ื›ืœ ืฉืขืœืชื” ื”ืคื•ืคื•ืœืจื™ื•ืช ืฉืœ Node.JS ื•ืžื™ืงืจื• ืคืจื™ื™ืžื•ื•ืจืงืก ื‘ืฆื“ ืฉืจืช ื• jQuery ื”ืคืกื™ืงื” ืœื”ื™ื•ืช ืื˜ืจืงืฆื™ื” ื›ืฉืžืชื›ื ืชื™ื "ืจืฆื™ื ื™ื™ื" ื”ืชื—ื™ืœื• ืœื”ื‘ื™ื ืœืขื•ืœื ื” Front End ืจืขื™ื•ื ื•ืช ืฉืœ ืชื›ื ื•ืช ืžื•ื ื—ื” ืขืฆืžื™ื ื•ืื ืงืคืกื•ืœืฆื™ื” ืฉื”ื ื”ื›ื™ืจื• ืžืกื‘ื™ื‘ื•ืช ืื—ืจื•ืช, ื‘ืžื™ื•ื—ื“ ื”ื—ืœ ืž 2008 ืขื ื”ืกืคืจ JavaScript The Good Parts. ื”ื”ืชืคื›ื—ื•ืช ืœื ืžื’ื™ืขื” ื‘ื’ืœืœ ืฉื”ื˜ื›ื ื•ืœื•ื’ื™ื” ืžืฉืชื ื” ืืœื ื‘ื’ืœืœ ืฉื”ื“ืจื™ืฉื•ืช, ื”ื™ื™ืฉื•ืžื™ื ื•ื”ืžืฉืชืžืฉื™ื ื”ืฉืชื ื•. ืฆื•ื•ืชื™ื ื’ื™ืœื• ืฉืืช ื”ืžื•ืฆืจ ืฉื”ื ื›ืชื‘ื• ื‘ืงืœื•ืช ื‘ Angular.JS ืื• ืจื™ื™ืœืก ื”ื ื›ื‘ืจ ืœื ืžืฆืœื™ื—ื™ื ืœืชื—ื–ืง ืื—ืจื™ ืฉื ืชื™ื™ื ืฉืœ ืคื™ืชื•ื—. ื”ืื‘ืกื•ืจื“ ื”ื•ื ืฉื“ื•ื•ืงื ื‘ื’ืœืœ ืฉื”ื™ื” ื›ืœ ื›ืš ืงืœ ืœื”ืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” X, ืœื ืขืฆืจื ื• ืœื—ืฉื•ื‘ ืื™ืš ื™ื”ื™ื” ื ื›ื•ืŸ ืœื”ืฉืชืžืฉ ื‘ื” ื•ืื™ืš ืœื‘ื ื•ืช ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉืชื—ื–ื™ืง ืžืขืžื“ ืœืื•ืจืš ืฉื ื™ื.

ToCode
1 419
1. ืฉื™ืžื•ืฉ ื‘ Programmatic Navigation ื›ื“ื™ ืœื ื•ื•ื˜ ื‘ืฆื•ืจื” ื™ื–ื•ืžื” ื›ืฉืžืฉืชืžืฉ ืœื•ื—ืฅ ืขืœ ื”ื›ืคืชื•ืจ ืœื”ืžืฉืš. 2. ืฉื™ืžื•ืฉ ื‘ Navigation Guards ื›ื“ื™ ืœืžื ื•ืข ืžืžืฉืชืžืฉ ืœื”ื’ื™ืข ืœื“ืฃ ื”ืžืฉื—ืง ืื ืฉื ื”ืžืฉืชืžืฉ ื”ื•ื ืจื™ืง. ื ืกื• ืœื‘ื ื•ืช ืืช ื”ืคื™ืชืจื•ืŸ ื‘ื›ืœ ืื—ืช ืžืฉืชื™ ื”ื“ืจื›ื™ื ื›ื“ื™ ืœืจืื•ืช ืื™ื–ื• ื“ืจืš ืืชื ืžืขื“ื™ืคื™ื.

ToCode
1 419
          <li v-for="n in 10" :key="`item-${n}`"><router-link :to="`/products/${n}`">Product {{n}}</router-link></li>
        </ul>
      </nav>
      <router-view />
    </div>
  </div>
</template>

<script>
  export default {
  }
</script>

<style scoped>
.buy-page {
  padding: 1rem;
}

.container {
  display: flex;
}

nav { 
  margin-right: 2rem;
}

ul {
  list-style: none;
  padding: 0;
}

</style>

ื”ืงื•ื‘ืฅ ื”ืžืœื”ื™ื‘ ื‘ืืžืช ื”ื•ื ProductPage.vue:
<template>
  <div v-if="data">
    <p>Product page for {{ data.name }}</p>
  </div>
  <div v-else>
    Loading...
  </div>
</template>

<script>
import { useSWR } from 'vswr'
import { useRoute } from 'vue-router'

export default {
  name: 'ProductPage',
  setup() {
    const route = useRoute()
    const { data, error } = useSWR(() => `https://swapi.dev/api/people/${route.params.id}`);

    return {
      data,
      error,
    }
  }
}
</script>

<style scoped>
</style>
ืงื•ื“ ืœื ืืจื•ืš ืื‘ืœ ืขื•ืฉื” ืžืกืคืจ ื“ื‘ืจื™ื ืžืขื ื™ื™ื ื™ื. ืชื—ื™ืœื” ื‘ืชื•ืš ืคื•ื ืงืฆื™ื™ืช setup ื”ืคื•ื ืงืฆื™ื” useRoute ืžื—ื–ื™ืจื” ืืช "ื”ื ืชื™ื‘" ื”ื ื•ื›ื—ื™. ื“ืจืš ืื•ื‘ื™ืงื˜ ื”ื ืชื™ื‘ ืื ื™ ื™ื›ื•ืœ ืœืงื‘ืœ ืืช ื”ืคืจืžื˜ืจ id ื‘ืืžืฆืขื•ืช ื”ืงืจื™ืื” route.params.id. ืฉื ื™ืช ื”ืคื•ื ืงืฆื™ื” useSWR ืขืœื™ื” ื›ื‘ืจ ื“ื™ื‘ืจืชื™ ื‘ืื—ื“ ื”ืคืจืงื™ื ื”ืงื•ื“ืžื™ื ื‘ืžื“ืจื™ืš ื–ื”, ืžืงื‘ืœืช ืคื•ื ืงืฆื™ื” ืฉืžื—ื–ื™ืจื” URL ื•ืžื•ืฉื›ืช ืืช ื”ืžื™ื“ืข ืžืื•ืชื• URL. ื‘ืจื’ืข ืฉื™ื”ื™ื” ืฉื™ื ื•ื™ ื‘ route.params.id ื”ืคื•ื ืงืฆื™ื” ืชื•ืคืขืœ ืฉื•ื‘ ื•ืชืžืฉื•ืš ืืช ื”ืžื™ื“ืข ื”ื—ื“ืฉ. ื‘ืžื‘ื ื” ื›ื–ื” ืื ื—ื ื• ืžื•ืฉื›ื™ื ืืช ื”ืžื™ื“ืข ืžื”ืฉืจืช ืื—ืจื™ ืฉื”ืงื•ืžืคื•ื ื ื˜ื” ProductPage ื ื›ื ืกื” ืœืขืžื•ื“ ื•ืœื›ืŸ ื‘ืชื‘ื ื™ืช ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ืื ื™ ืžื˜ืคืœ ื’ื ื‘ืžืงืจื” ื‘ื• ื”ืžื™ื“ืข ืขื“ื™ื™ืŸ ืœื ื–ืžื™ืŸ. ื–ื” ื” if/else ืฉืžื•ืคื™ืข ืฉื ืฉืžืฆื™ื’ ืืช ื”ืžื™ืœื” Loading ืื data ืขื“ื™ื™ืŸ ืจื™ืง. ื”ืฉื™ื ื•ื™ ื”ืื—ืจื•ืŸ ื”ื•ื ื”ืชื•ืกืคืช:
<router-link to="/products">Shop</router-link>
ื‘ืชืคืจื™ื˜ ื”ืขืœื™ื•ืŸ ื‘ืงื•ืžืคื•ื ื ื˜ื” App.vue. ื .ื‘. ืืชื ื™ื›ื•ืœื™ื ืœืฉื™ื ืœื‘ ืฉื”ื•ืกืคืชื™ ื’ื ืงื•ื‘ืฅ CSS ื‘ืฉื assets/main.css. ื‘ืขื‘ื•ื“ื” ืขื vue ืื ื™ ืžืขื“ื™ืฃ ืœื”ื•ืกื™ืฃ ืงื•ื‘ืฅ CSS ืžืกื•ื“ืจ ืขื‘ื•ืจ ื›ืœืœื™ CSS ื’ืœื•ื‘ืืœื™ื™ื ืฉืžืฉืคื™ืขื™ื ืขืœ ื›ืœ ื”ื“ืคื™ื, ื•ืœื”ืฉืชืžืฉ ื‘ื”ื’ื“ืจื•ืช ื” style ื‘ืชื•ืš ืงื‘ืฆื™ vue ื‘ืฉื‘ื™ืœ ื›ืœืœื™ ืขื™ืฆื•ื‘ ืฉืจืœื•ื•ื ื˜ื™ื ืœืงื•ืžืคื•ื ื ื˜ื” ืžืกื•ื™ืžืช. ## ื ืชื™ื‘ื™ื ืขื ืฉืžื•ืช ื˜ืจื™ืง ืื—ืจื•ืŸ ืฉืœ Vue Router ืฉืื ื™ ืจื•ืฆื” ืœื”ืจืื•ืช ื”ื•ื ื”ืชืžื™ื›ื” ื‘ื ื™ื•ื•ื˜ ืœืคื™ ืฉืžื•ืช. ืฉื™ืžื• ืœื‘ ืœืคืงื•ื“ื•ืช ื” router-link ื‘ื˜ืžืคืœื™ื™ื˜ ืฉืœื ื•:
<router-link to="/contact">Contact Us</router-link>
ืื ืžื—ืจ ืื ื™ ืืจืฆื” ืœืฉื ื•ืช ืืช ืžื‘ื ื” ื”ื ืชื™ื‘, ืœืžืฉืœ ืœืฉื ื•ืช ืืช ื” URL ืฉื™ื”ื™ื” /contact-us ืื ื™ ืืฆื˜ืจืš ืœืœื›ืช ืœื›ืœ router-link ืฉืžื•ื‘ื™ืœ ืœื ืชื™ื‘ ื–ื” ื•ืœืฉื ื•ืช ืื•ืชื•, ื•ื‘ืžืขืจื›ืช ื’ื“ื•ืœื” ื–ื” ืขืœื•ืœ ืœื”ื™ื•ืช ืืจื•ืš ื•ืžื•ืขื“ ืœื˜ืขื•ื™ื•ืช. ื˜ืจื™ืง ื ื—ืžื“ ืฉืืคืฉืจ ืœืขืฉื•ืช ื‘ืžืงื•ื ื”ื•ื ืœื”ื•ืกื™ืฃ ืžืืคื™ื™ืŸ name ื‘ื”ื’ื“ืจืช ื”ื ืชื™ื‘ ื‘ืื•ืคืŸ ื”ื‘ื:
{ path: "/contact", component: Contact, name: "contact" },
ื•ืื– ื‘ router-link ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื• name ืฉื”ื•ื ืžื–ื”ื” ืคื ื™ืžื™ ืฉืœื ืงืฉื•ืจ ืœ URL. ืงื•ื“ ื” router-link ืฉื™ืฉืชืžืฉ ื‘ name ื™ื”ื™ื”:
<router-link :to="{ name: 'contact' }">Contact Us</router-link>
ื‘ื ืชื™ื‘ ืขื ืคืจืžื˜ืจื™ื, ืœื“ื•ื’ืžื” ื‘ืงื™ืฉื•ืจ ืœื“ืฃ ืžื•ืฆืจ, ื”ืงื•ื“ ื™ืจืื” ื›ืš:
<router-link :to="{ name: 'product', params: { id: 7 } }">Product 7</router-link>
ืžื‘ื ื” ื›ื–ื” ืžืืคืฉืจ ืœื™ ืœืฉื ื•ืช ืืช ื” URL-ื™ื ื‘ืœื™ ืฉืืฆื˜ืจืš ืœืจื•ืฅ ืœืฉื ื•ืช ื‘ื”ืชืืžื” ืืช ื›ืœ ื”ืœื™ื ืงื™ื ื‘ื›ืœ ื”ืžืขืจื›ืช. ## ืขื›ืฉื™ื• ืืชื ื‘ืชืจื’ื™ืœ ื”ืคืขื ืื ื™ ืจื•ืฆื” ืœืฉืœื•ื— ืืชื›ื ืœืœืžื•ื“ ืžืฉื”ื• ื—ื“ืฉ ืขืœ ื” Router ื•ืœืฉืœื‘ ืืช ื–ื” ืขื ืคื™ืชื•ื— ืžืฉื—ืงื•ืŸ ื‘ Vue: 1. ื›ืชื‘ื• ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื‘ Vue. ื”ืžืฉื—ืง ืžืฆื™ื’ 10 ืจื™ื‘ื•ืขื™ื ืืคื•ืจื™ื, ื›ืœ ืื—ื“ ืžื™ื™ืฆื’ ืงืœืฃ ื•ื”ืงืœืคื™ื ืžืžื•ืกืคืจื™ื ืž-1 ืขื“ 5. ืœื—ื™ืฆื” ืขืœ ืงืœืฃ ื”ื•ืคื›ืช ืื•ืชื• ื•ื—ื•ืฉืคืช ืืช ื”ืžืกืคืจ ืฉื‘ื•. ืื—ืจื™ ื”ืœื—ื™ืฆื” ืขืœ ืงืœืฃ ื ื•ืกืฃ ืื ืœืฉื ื™ ื”ืงืœืคื™ื ืื•ืชื• ืžืกืคืจ ืฉื ื™ื”ื ื ืฉืืจื™ื ื’ืœื•ื™ื™ื, ื•ืื ืžืกืคืจื™ื ืฉื•ื ื™ื ืฉื ื™ื”ื ื™ื•ืกืชืจื•. 2. ืื—ืจื™ ืฉื™ืฉ ืœื›ื ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื ืžืฉื™ืš ืœืฉื™ืœื•ื‘ ื” Router. ื›ืชื‘ื• ืžืกืš ืคืชื™ื—ื” ื”ื›ื•ืœืœ ืชื™ื‘ื” ืœื‘ื—ื™ืจืช ืฉื ืžืฉืชืžืฉ ื•ื›ืคืชื•ืจ "ื”ืชื—ื™ืœื• ืžืฉื—ืง". ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืื—ืจื™ ื‘ื—ื™ืจืช ืฉื ืžืฉืชืžืฉ ืžืชื—ื™ืœื” ืžืฉื—ืง. 3. ื‘ืžื”ืœืš ื”ืžืฉื—ืง ื ืกืคื•ืจ ืœืฉื—ืงืŸ ื›ืžื” ื–ืžืŸ ืœืงื— ืœื”ืคื•ืš ืืช ื›ืœ ื”ืงืœืคื™ื - ื›ืœื•ืžืจ ืœื”ื’ื™ืข ืœื ื™ืฆื—ื•ืŸ. ืืช ื”ื–ืžืŸ ื ืฉืžื•ืจ ื‘ื˜ื‘ืœืช ืฉื™ืื™ื. 4. ื”ื•ืกื™ืคื• ืœืžืกืš ื”ืคืชื™ื—ื” ืงื™ืฉื•ืจ ืœื˜ื‘ืœืช ื”ืฉื™ืื™ื ืฉืžืจืื” ืืช 5 ื”ืฉื—ืงื ื™ื ืฉืกื™ื™ืžื• ืืช ื”ืžืฉื—ืง ื”ื›ื™ ืžื”ืจ. ืžื˜ื‘ืœืช ื”ืฉื™ืื™ื ืืคืฉืจ ืœื—ื–ื•ืจ ืœืžืกืš ื”ืคืชื™ื—ื” ืื‘ืœ ืœื ืœื”ืชื—ื™ืœ ืžืฉื—ืง ื—ื“ืฉ. ื‘ืฉื‘ื™ืœ ืœืคืชื•ืจ ืืช ื”ืชืจื’ื™ืœ ืชืฆื˜ืจื›ื• ืœื’ืœื•ืช ืื™ืš ืœืขื‘ื•ืจ ืžืžืกืš ื”ืคืชื™ื—ื” ืœืžืกืš ื”ืžืฉื—ืง ืจืง ืื ื”ื’ื•ืœืฉ ื‘ื—ืจ ืฉื ืžืฉืชืžืฉ, ืื‘ืœ ืœื ืœืืคืฉืจ ืžืขื‘ืจ ืื ืฉื ื”ืžืฉืชืžืฉ ืจื™ืง. ื‘ Vue Router ื ื™ืชืŸ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื‘ืžืกืคืจ ื“ืจื›ื™ื:

ToCode
1 419
ื‘ืžืฆื‘ ืขื ื™ื™ื ื™ื ืจื’ื™ืœ ืคืจืžื˜ืจ ืฉืงื•ืžืคื•ื ื ื˜ื” ืžืงื‘ืœืช ืขื•ื‘ืจ ืืœื™ื” ื‘ืชื•ืจ Prop; ืื‘ืœ ื›ืฉื”ืงื•ืžืคื•ื ื ื˜ื” ื ืžืฆืืช ื‘ืชื•ืจ ื ืชื™ื‘ ื‘ Router ื”ืคืจืžื˜ืจ ืขื•ื‘ืจ ื‘ืฆื•ืจื” ืงืฆืช ืฉื•ื ื”. ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืืช ื–ื” ื ื•ืกื™ืฃ ืœืืชืจ ืฉืœื ื• ื“ืฃ ืฉืœ ื—ื ื•ืช ืžืจืฆ'ื ื“ื™ื™ื– ืฉืžื•ื›ืจืช ื‘ื•ื‘ื•ืช ืฉืœ ืžืœื—ืžืช ื”ื›ื•ื›ื‘ื™ื. ื›ืœ "ืžื•ืฆืจ" ื™ื”ื™ื” ื‘ืกืš ื”ื›ืœ ื“ืฃ ืขื ืฉื ืฉืœ ื“ืžื•ืช ืื—ืจืช ืžื”ืกืจื˜. ืœืคื ื™ ื”ืžืขื‘ืจ ืœืคืจื•ื“ืงืฉืŸ ื ืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืขื™ืฆื•ื‘, ืžื—ื™ืจ ื•ืชื™ืื•ืจ ืœื›ืœ ื‘ื•ื‘ื” - ืื‘ืœ ื‘ื™ื ืชื™ื™ื ื•ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ืฉื ื”ื“ืžื•ืช ื™ืกืคื™ืง. ืื ื ื“ืžื™ื™ืŸ ืืช ืžื‘ื ื” ื”ื ืชื™ื‘ื™ื ืืคืฉืจ ืœื“ืžื™ื™ืŸ ื ืชื™ื‘ ืจืืฉื™ ืฉืœ ื”ื—ื ื•ืช /products, ื•ืื—ืจื™ื• ื ืชื™ื‘ื™ื ืœื›ืœ ืื—ื“ ืžื”ืžื•ืฆืจื™ื ื›ืžื• /products/1, /products/2 ื• /products/7. ื›ืœ ืžืกืคืจ ืžื™ื™ืฆื’ ืžื–ื”ื” ืฉืœ ืžื•ืฆืจ ืื—ืจ. ืื ื—ื ื• ื›ื‘ืจ ื™ื•ื“ืขื™ื ืฉื”ื ืชื™ื‘ ื”ืจืืฉื™ ื™ื”ื™ื” ื”ืžื—ืจื•ื–ืช /products. ืœื’ื‘ื™ ื ืชื™ื‘ื™ ื”ืžื•ืฆืจื™ื ื”ื ื ืงืจืื™ื ื ืชื™ื‘ื™ื ืขื ืคืจืžื˜ืจื™ื ื•ืื ื—ื ื• ืžืชืืจื™ื ืื•ืชื ื‘ืืžืฆืขื•ืช ื”ื—ืœืคืช ื”ื—ืœืง ื”ืžืฉืชื ื” (ื”ืžืกืคืจ) ื‘ืžื™ืœื” ืฉืชื”ื™ื” ืฉื ื”ืคืจืžื˜ืจ ืขื ืชื—ื™ืœื™ืช :, ื›ืœื•ืžืจ ื‘ืžืงืจื” ืฉืœ ื”ื—ื ื•ืช ื™ื”ื™ื” ืœื ื• /products/:id. ื‘ื ื•ืกืฃ ืฉื ื™ ื”ื ืชื™ื‘ื™ื /products ื• /products/:id ื›ื•ืœืœื™ื ื—ืœืงื™ื ืžืฉื•ืชืคื™ื: ื‘ื ืชื™ื‘ products ืื ื™ ืžืฆืคื” ืœืจืื•ืช ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืžื•ืฆืจื™ื ื‘ืื™ื–ืฉื”ื• ืชืคืจื™ื˜ ืฆื“ ื•ืœื”ืฉืื™ืจ ืืช ื”ืื–ื•ืจ ื”ืžืจื›ื–ื™ ืจื™ืง ื›ื™ ื›ืจื’ืข ืื ื—ื ื• ืœื ืžืกืชื›ืœื™ื ืขืœ ืืฃ ืžื•ืฆืจ; ื•ื‘ื ืชื™ื‘ /products/:id, ืœื ืžืฉื ื” ืขื‘ื•ืจ ืื™ื–ื” id, ืื ื™ ืžืฆืคื” ืœืจืื•ืช ืืช ืื•ืชื• ืชืคืจื™ื˜ ืฆื“ ืขื ืจืฉื™ืžืช ื”ืžื•ืฆืจื™ื ืื‘ืœ ื”ืคืขื ื‘ื—ืœืง ื”ืžืจื›ื–ื™ ืืช ืคืจื˜ื™ ื”ืžื•ืฆืจ ืฉืžืชืื™ื ืœ id. ื™ืฉ ืžืกืคืจ ื“ืจื›ื™ื ืœื”ืฆื™ื’ ืชื•ื›ืŸ ืžืฉื•ืชืฃ ื‘ื™ืŸ ืžืกืคืจ ื“ืคื™ื ื‘ Vue, ืื‘ืœ ื‘ื’ืœืœ ืฉืื ื—ื ื• ืžื“ื‘ืจื™ื ื›ืืŸ ืขืœ Vue Router ืื ื™ ืืจืื” ืืช ื”ื“ืจืš ืฉืžืฉืชืžืฉืช ื‘ Router - ื•ื”ื™ื ื”ืฉื™ืžื•ืฉ ื‘ children. ื”ืจืขื™ื•ืŸ ื”ื•ื ืฉื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ื™ื›ื•ืœื” ืœื”ื›ื™ืœ ืชืชื™-ื ืชื™ื‘ื™ื ืขื‘ื•ืจ ืžื•ืคืขื™ื ืฉืœ router-view ืฉื ืžืฆืื™ื ื‘ืชื•ื›ื”. ื›ืœื•ืžืจ ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ื‘ืชื•ืš ื”ื’ื“ืจืช ื ืชื™ื‘:
{
    path: '/products',
    component: Store,
    children: [
        { path: ':id', component: ProductPage },
    ]
}
ื•ื‘ืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื” Store ืœื™ื™ืฆืจ router-view, ื•ืื– ืื ื”ื ืชื™ื‘ ืžืชืื™ื ืœ /products ืื•ืชื• router-view ืคื ื™ืžื™ ื™ื•ืคื™ืข ืจื™ืง; ื•ืื ื”ื ืชื™ื‘ ืžืชืื™ื ืœ /products/:id (ืœืžืฉืœ ืื ื–ื” /products/8) ืื– ื‘ืชื•ืš ื” router-view ืชื•ืคื™ืข ื”ืงื•ืžืคื•ื ื ื˜ื” ProductPage ืฉืชืงื‘ืœ ืืช ื”ืคืจืžื˜ืจ id. ื ืžืฉื™ืš ืœื›ืชื™ื‘ืช ื”ืงื•ื“ ืœื—ื ื•ืช ื•ืœืžื•ืฆืจื™ื ื•ืื—ืจ ื›ืš ื”ืกื‘ืจ ืขืœื™ื•. ืืชื ืžื•ื–ืžื ื™ื ื›ื‘ืจ ืœืจืื•ืช ืืช ื”ืชื•ืฆืื” ื‘ืงื•ื“ืกื ื“ื‘ื•ืงืก ื›ืืŸ: <iframe src="https://codesandbox.io/embed/vue-router-demo-1-forked-e2nq9?fontsize=14&hidenavigation=1&theme=dark" style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;" title="vue-router-demo-1 (forked)" allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts" ></iframe> ืื• ื‘ืงื™ืฉื•ืจ: https://codesandbox.io/s/vue-router-demo-1-forked-e2nq9?file=/src/assets/main.css. ื”ืงื•ื“ ื›ื•ืœืœ ืงืฆืช ืืจื’ื•ืŸ ืžื—ื“ืฉ ื‘ื”ืฉื•ื•ืื” ืœื“ื•ื’ืžื” ื”ืงื•ื“ืžืช. ื”ื•ืฆืืช ืืช ื”ื ืชื™ื‘ื™ื ืœืงื•ื‘ืฅ routes.js ื›ื“ื™ ืฉืœื ื™ืชืขืจื‘ื‘ื• ืขื ื“ื‘ืจื™ื ืื—ืจื™ื ื‘ืงื•ื‘ืฅ main.js. ืœืงื•ื‘ืฅ routes ื”ื•ืกืคืชื™ ืืช ื”ื ืชื™ื‘ products ื•ืืช ื”ื™ืœื“ื™ื ืฉืœื• ื‘ื ืชื™ื‘ /products/:id. ื›ื›ื” ื–ื” ื ืจืื”:
import Home from "./components/Home";
import About from "./components/About";
import Contact from "./components/Contact";
import Store from "./components/Store";
import ProductPage from "./components/ProductPage";

const routes = [
  { path: "/", component: Home, name: "home" },
  { path: "/about", component: About, name: "about" },
  { path: "/contact", component: Contact, name: "contact" },
  {
    path: "/products",
    component: Store,
    name: "shop",
    children: [
      { path: "/products/:id", component: ProductPage, name: "product" }
    ]
  }
];

export default routes;
ื‘ืฉืœื‘ ื–ื” ืืคืฉืจ ืœื”ืชืขืœื ืžืฉื“ื” name ืฉื”ื•ืกืคืชื™ ืœื›ืœ ื ืชื™ื‘. ื‘ื“ื•ื’ืžื” ื”ื‘ืื” ืืกืคืจ ืœื›ื ืœืžื” ื”ื•ื ื˜ื•ื‘. ื”ืงื•ืžืคื•ื ื ื˜ื” Store ืœื ื›ื•ืœืœืช ื”ืจื‘ื” ืชื•ื›ืŸ ื—ื“ืฉ ื•ื‘ืกืš ื”ื›ืœ ืžืฆื™ื’ื” ืงื•ื ื˜ื™ื™ื ืจ ืขื ืชืคืจื™ื˜ ืฆื“ ืฉืžืฆื™ื’ ื›ืคืชื•ืจ ื ื™ื•ื•ื˜ ืœื›ืœ ืื—ื“ ืžื”ืžื•ืฆืจื™ื - ื›ืš ื ืจืื” ื”ืงื•ื‘ืฅ Store.vue:
<template>
  <div class='buy-page'>
    <h1>Buy Some Stuff</h1>
    <p>Please find below the descriptions for our star wars action figures</p>

    <div class="container">
      <nav class="sidenav">
        <ul>

ToCode
1 419
      <router-link to="/">Home</router-link>
      <router-link to="/about">About Us</router-link>
      <router-link to="/contact">Contact Us</router-link>
    </nav>
    <main>
      <router-view />
    </main>
  </div>
</template>

<script>
export default {
  name: 'App',
}
</script>

<style>

html, body {
  padding: 0; margin: 0;
}

nav {
  padding: 1rem;
  padding-left: 0.1rem;
  background: #595959;
}

nav a {
  margin: 0.2rem;
  text-decoration: none;
  background: #99aabc;
  padding: 0.2rem 0.5rem;
  width: 5rem;
  text-align: center;
  display: inline-block;
  color: #2211f1;
}

nav a::visited {
  color: #2211f1;
}

nav a.router-link-active {
  background: yellow;
}

</style>

ืืช ื”ืชื•ืฆืื” ืืคืฉืจ ืœืจืื•ืช ื‘ืงื•ื“ืกื ื“ื‘ื•ืงืก ื”ื‘ื: <iframe src="https://codesandbox.io/embed/vue-router-demo-1-cp0e7?fontsize=14&hidenavigation=1&theme=dark" style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;" title="vue-router-demo-1" allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts" ></iframe> ื•ื‘ืงื™ืฉื•ืจ: https://codesandbox.io/s/vue-router-demo-1-cp0e7?file=/src/App.vue. ื”ื ืงื•ื“ื” ื”ืจืืฉื•ื ื” ื”ื™ืชื” ื”ื’ื“ืจืช ื”ื ืชื™ื‘ื™ื. ืฉื™ืžื• ืœื‘ ืœืงื˜ืข ื”ื‘ื ืžื”ืงื•ื‘ืฅ main.js:
const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
  { path: '/contact', component: Contact },
];
ื”ืงื˜ืข ืžื’ื“ื™ืจ ืžืขืจืš ืฉืœ 4 ืื•ื‘ื™ืงื˜ื™ื, ื›ืœ ืื•ื‘ื™ืงื˜ ืžื™ื™ืฆื’ "ื ืชื™ื‘". ืœื ืชื™ื‘ ื™ืฉ ืืช ื” URL ืฉืœื• ื•ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉืชื•ืคื™ืข ื›ืฉืžืฉืชืžืฉ ื™ื™ื›ื ืก ืœื ืชื™ื‘. ื‘ืฉื‘ื™ืœ ืœืืชื—ืœ ืืช ื”ืืคืœื™ืงืฆื™ื” ืขื ื”ื ืชื™ื‘ื™ื ืื ื™ ืžืฉืชืžืฉ ื‘ืงื•ื“:
const router = VueRouter.createRouter({
  history: VueRouter.createWebHashHistory(),
  routes,
});

createApp(App)
  .use(router)
  .mount('#app')
ื”ืคื•ื ืงืฆื™ื” createRouter ื™ื•ืฆืจืช ืืช ืื•ื‘ื™ืงื˜ ื” Router, ื•ื”ืคื•ื ืงืฆื™ื” use ืžื•ืกื™ืคื” ืืช ื” Router ืœื™ื™ืฉื•ื. ื”ืคืงื•ื“ื” createWebHashHistory ื”ื™ื ื–ืืช ืฉื‘ื’ืœืœื” ื›ืœ ื”ื ืชื™ื‘ื™ื ืžื•ืคื™ืขื™ื ืขื ืกื™ืžืŸ ื” #. ื”ืืœื˜ืจื ื˜ื™ื‘ื” ื ืงืจืืช createWebHistory ื•ืชืฉืชืžืฉ ื‘ History API. ื‘ืชื•ืš ื”ืงื•ื‘ืฅ App.vue ืืคืฉืจ ืœืจืื•ืช ืฉื”ื’ื“ืจืชื™ ื‘ืชื‘ื ื™ืช ืืช ื›ืคืชื•ืจื™ ื”ื ื™ื•ื•ื˜ ื‘ืชื•ืจ router-link:
    <nav>
      <router-link to="/">Home</router-link>
      <router-link to="/about">About Us</router-link>
      <router-link to="/contact">Contact Us</router-link>
    </nav>
ื ื›ื•ืŸ, ื‘ืžืงื•ื herf ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืžืืคื™ื™ืŸ to, ืื‘ืœ ื—ื•ืฅ ืžื–ื” ื–ื” ืžืกืคื™ืง ื“ื•ืžื” ืœ a. ื‘ื•ื ื•ืก ื ื—ืžื“ ืฉืงื™ื‘ืœื ื• ื”ื•ื CSS Class ื‘ืฉื ื”ืžื™ื•ื—ื“ router-link-active ืฉื™ืชื•ื•ืกืฃ ืื•ื˜ื•ืžื˜ื™ืช ืœ router-link ืฉืžื™ื™ืฆื’ ืืช ื”ื“ืฃ ืฉื›ืจื’ืข ืื ื™ ื ืžืฆื ื‘ื•. ืงื•ื“ ื” CSS ื”ื‘ื ื’ื•ืจื ืœืงื™ืฉื•ืจ ื–ื” ืœืงื‘ืœ ืจืงืข ืฆื”ื•ื‘:
nav a.router-link-active {
  background: yellow;
}
ืฉื•ืจื” ืื—ืจื•ื ื” ื‘ื˜ืžืคืœื™ื™ื˜ ื‘ืื•ืชื• ืงื•ื‘ืฅ App.vue ื”ื™ื:
<main>
    <router-view />
</main>
ืœืชื•ืš ืืœืžื ื˜ ื–ื” Vue ื›ื•ืชื‘ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืžืชืื™ืžื” ืœื ืชื™ื‘ ืžื‘ื™ืŸ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉืžื•ืคื™ืขื•ืช ื‘ื˜ื‘ืœืช ื”ื ืชื™ื‘ื™ื ืฉืœื•. ## ื™ืฆื™ืจืช ืงื•ืžืคื•ื ื ื˜ื” ืื—ืช ืœื˜ื™ืคื•ืœ ื‘ื ืชื™ื‘ ืขื ืคืจืžื˜ืจื™ื ืฉื•ื ื™ื ืืคืœื™ืงืฆื™ื•ืช ื‘ืขื•ืœื ื”ืืžื™ืชื™ ื”ืจื‘ื” ืคืขืžื™ื ืฆืจื™ื›ื•ืช ืœื”ืฆื™ื’ ืžื™ื“ืข ื•ื”ืจื‘ื” ืคืขืžื™ื ื‘ืฉื‘ื™ืœ ืœื”ืฆื™ื’ ืžื™ื“ืข ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืื•ืชื” ืชื‘ื ื™ืช, ื›ืืฉืจ ื›ืœ ืคืขื ืžืžืœืื™ื ืื•ืชื” ื‘ืžื™ื“ืข ืื—ืจ. ืœื“ื•ื’ืžื”: 1. ืืชืจ ืฉืœ ื—ื ื•ืช ืฉืžืฆื™ื’ ืžื•ืฆืจื™ื ืฉื•ื ื™ื - ื”ืชื‘ื ื™ืช ืฉืœ ื“ืฃ ื”ืžื•ืฆืจ ื–ื”ื” ืœื›ืœ ื”ืžื•ืฆืจื™ื, ืื‘ืœ ื”ืชื•ื›ืŸ ืฉื•ื ื” ื‘ื™ืŸ ืžื•ืฆืจ ืœืžื•ืฆืจ. 2. ืืชืจ ืฉืœ ื ื™ื”ื•ืœ ืื™ืจื•ืขื™ื ืฉืžืืคืฉืจ ืœื”ืฆื™ื’ ื“ืฃ ืœื›ืœ ืื™ืจื•ืข. ื”ืชื‘ื ื™ืช ืœื›ืœ ืื™ืจื•ืข ื–ื”ื” ืื‘ืœ ื”ืžื™ื“ืข ื›ืžื• ืฉื ื”ืื™ืจื•ืข, ื”ืชืืจื™ืš ื•ื”ืžืงื•ื ื™ื”ื™ื• ืฉื•ื ื™ื ื‘ื™ืŸ ื”ืื™ืจื•ืขื™ื. 3. ืืชืจ ืฉืœ ื‘ื™ืช ืžืœื•ืŸ ืฉื›ื•ืœืœ ื“ืฃ ืžื™ื“ืข ืขืœ ื›ืœ ืกื•ื’ ื—ื“ืจ. ืชื‘ื ื™ืช ื“ืฃ ื”ืžื™ื“ืข ื–ื”ื” ืื‘ืœ ื”ืžื™ื“ืข ื›ืžื• ื’ื•ื“ืœ ื”ื—ื“ืจ, ื”ืชืžื•ื ื•ืช ื•ื”ืžื—ื™ืจ ืฉื•ื ื™ื ื‘ื™ืŸ ืกื•ื’ื™ ื”ื—ื“ืจื™ื ื”ืฉื•ื ื™ื. ื”ืžืฉื•ืชืฃ ืœื›ืœ ื”ืืชืจื™ื ื”ื•ื ืฉื™ืฉ ืœื ื• ืชื‘ื ื™ืช ื–ื”ื” ื•ืœืชื•ื›ื” ืื ื—ื ื• ื›ื•ืชื‘ื™ื ื›ืœ ืคืขื ืชื•ื›ืŸ ืื—ืจ. ืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœ ื”ืชื‘ื ื™ืช ื‘ืชื•ืจ ืงื•ืžืคื•ื ื ื˜ื” ื•ื”ืชื•ื›ืŸ ื”ืื—ืจ ื™ืื•ืคื™ื™ืŸ ื‘ืืžืฆืขื•ืช ืคืจืžื˜ืจื™ื ืžืกื•ื™ืžื™ื ืฉืขื•ื‘ืจื™ื ืœืงื•ืžืคื•ื ื ื˜ื”. ืœื“ื•ื’ืžื” ื‘ืืชืจ ื ื™ื”ื•ืœ ื”ืื™ืจื•ืขื™ื ืชื”ื™ื” ืงื•ืžืคื•ื ื ื˜ื” ืœื”ืฆื’ืช ืคืจื˜ื™ ืื™ืจื•ืข ืฉืชืงื‘ืœ ื‘ืชื•ืจ ืคืจืžื˜ืจ ืืช ืžื–ื”ื” ื”ืื™ืจื•ืข, ื•ืชื•ื›ืœ ื‘ืืžืฆืขื•ืช ืžื–ื”ื” ื–ื” ืœืžืฉื•ืš ืžื”ืฉืจืช ืืช ื”ืžื™ื“ืข ืขืœ ืคืจื˜ื™ ื”ืื™ืจื•ืข.

ToCode
1 419
ืื– ืชื•ื›ืœื• ืœื™ื™ืฆืจ ืงื™ืฉื•ืจ ืขื ืกื™ืžืŸ # ืฉื™ื•ื‘ื™ืœ ืœื“ืฃ ื” HTML ื”ื–ื” ื•ืœื ืงื•ื“ื” ื”ืกืคืฆื™ืคื™ืช tasks ื‘ืชื•ืš ื”ื“ืฃ. ืื ืœื“ื•ื’ืžื” ื›ืชื‘ืชื ืืช ืชื’ื™ืช ื” a ื‘ืชื•ืš ื“ืฃ HTML ืฉื ืงืจื demo.html ืื– ื”ืงื™ืฉื•ืจ demo.html#tasks ื™ื•ื‘ื™ืœ ืืช ื”ื’ื•ืœืฉ ื™ืฉื™ืจื•ืช ืœืžืงื•ื ื‘ืขืžื•ื“ ื‘ื• ืžื•ืคื™ืข ื” a, ื›ืœื•ืžืจ ื™ืฉื™ืจื•ืช ืœืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช. ืฉื™ื ื•ื™ ื” Hash ื”ื™ื” ื”ื“ืจืš ื”ื™ื—ื™ื“ื” ืฉื”ื™ืชื” ืœื ื• ืœืฉื ื•ืช ืืช ื” URL ื‘ืœื™ ืœื—ื™ื™ื‘ ื’ื™ืฉื” ืžื—ื“ืฉ ืœืฉืจืช, ื•ืœื›ืŸ ืงื•ื ืกืคื˜ ืจืืฉื•ืŸ ืฉืœ Single Page Application ืฉื ื•ืฆืจ ื ืงืจื Hash Navigation. ื‘ืกื›ื™ืžื” ื–ื• ื›ืœ "ื“ืฃ" ื‘ื™ื™ืฉื•ื ื”ื•ื ืคืฉื•ื˜ Hash ืฉื•ื ื” ื‘ืชื•ืš HTML ื™ื—ื™ื“. ื›ืš ื™ื”ื™ื• ืœื ื• index.html#home, index.html#about, index.html#contact ื•ืืคื™ืœื• index.html#products/2. ื‘ื›ืœ ืื—ื“ ืžื”ืžืงืจื™ื ื”ื“ืคื“ืคืŸ ื™ืคื ื” ืœืฉืจืช ื›ื“ื™ ืœืžืฉื•ืš ืืช ื”ืงื•ื‘ืฅ index.html, ื•ืงื•ื“ JavaScript ื™ืกืชื›ืœ ืขืœ ื” Hash ื•ื™ืžืœื ืืช ื”ืชื•ื›ืŸ ืฉืื ื—ื ื• ืจื•ืื™ื ื‘ืขืžื•ื“ ื›ื“ื™ ืœื”ืชืื™ื ืœ"ื“ืฃ" ื‘ื• ืจืฆื™ื ื• ืœื‘ืงืจ. ืœื™ืžื™ื ื“ืคื“ืคื ื™ื ื”ื•ืกื™ืคื• ืชืžื™ื›ื” ื‘ืžื ื’ื ื•ืŸ ืฉื ืงืจื History API. ื‘ืžื ื’ื ื•ืŸ ื–ื” ืืคืฉืจ ื”ื™ื” ื›ื‘ืจ ืžืชื•ืš ืงื•ื“ JavaScript ืœืฉื ื•ืช ืืช ื” URL ื‘ืœื™ ืฉื ืฆื˜ืจืš ืคื ื™ื” ืœืฉืจืช, ื•ืœื›ืŸ ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ URL-ื™ื ืจื’ื™ืœื™ื ืœื’ืžืจื™, ื•ื›ืฉืžืฉืชืžืฉ ืจื•ืฆื” ืœืขื‘ื•ืจ ื“ืฃ ืื ื™ ืคืฉื•ื˜ ืžืชื•ืš JavaScript ื‘ืฆื•ืจื” ื™ื–ื•ืžื” ืžืฉื ื” ืืช ื” URL. ืขื›ืฉื™ื• ื ื•ืฆืจื” ื‘ืขื™ื” ื—ื“ืฉื” ืฉื”ื™ื ืฆื“ ื”ืฉืจืช - ืฉื”ื™ื” ืฆืจื™ืš ืœื”ืชืžื•ื“ื“ ืขื ื›ื ื™ืกื” ืœื›ืœ ืžื™ื ื™ URL-ื™ื ืืคื™ืœื• ืฉืื™ืŸ ืงื‘ืฆื™ HTML ืื• ืงื•ื“ ืฆื“ ืฉืจืช ืฉื™ื•ื“ืข ืœื˜ืคืœ ื‘ื”ื. ืœื“ื•ื’ืžื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื™ืฉ ืœื™ ืจืง ืงื•ื‘ืฅ index.html ืขืœ ื”ืฉืจืช ื•ืื– ื‘ื˜ืขื™ื ื” ื”ืจืืฉื•ื ื” ื” URL ื”ื•ื index.html, ืื‘ืœ ืžืฉืชืžืฉ ืขื•ื‘ืจ ืœื“ืฃ "ืื•ื“ื•ืช" ื•ืงื•ื“ JavaScript ืžืฉื ื” ืืช ื” URL ืœ about.html (ื•ืื™ืŸ ืงื•ื‘ืฅ ื›ื–ื” ืขืœ ื”ืฉืจืช). ืขื›ืฉื™ื• ืขื“ ืœืคื” ื”ื›ืœ ืขื•ื‘ื“ ื›ื™ ืฉื™ื ื•ื™ ื” URL ื‘ื•ืฆืข ืจืง ื‘ืงื•ื“ JavaScript ื‘ืœื™ ืคื ื™ื” ืœืฉืจืช, ืื‘ืœ ืื ืžืฉืชืžืฉ ื™ืฉืžื•ืจ ืืช ื” URL ื”ื—ื“ืฉ ื‘ืชื•ืจ ืกื™ืžื ื™ื” ืื• ื™ืจืขื ืŸ ืืช ื”ืขืžื•ื“, ื”ืฉืจืช ื™ืฆื˜ืจืš ืœื”ืชืžื•ื“ื“ ืขื ืคื ื™ื” ืœื ืชื™ื‘ about.html ืฉืœื ืงื™ื™ื ืฉื. ื›ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื ื™ื™ืฉื•ืžื™ Single Page ื”ื™ื•ื ื™ืฉ ืœื ื• ืœื›ืŸ ืฉืชื™ ืืคืฉืจื•ื™ื•ืช: 1. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืžื ื’ื ื•ืŸ ื” Hash ื”ื™ืฉืŸ ืฉืขื“ื™ื™ืŸ ืขื•ื‘ื“. ื” URL ื™ืจืื” ืงืฆืช ืžื•ื–ืจ ืื‘ืœ ืœื ื ื“ืจืฉืช ืฉื•ื ื”ืชืืžื” ืœืงื•ื“ ืฆื“ ื”ืฉืจืช ื‘ืฉื‘ื™ืœ ืœื”ืฉืชืžืฉ ื‘ื–ื”. 2. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืขื“ื›ืŸ ืืช ืงื•ื“ ืฆื“ ื”ืฉืจืช ื›ืš ืฉื™ืขื ื” ืœื›ืœ ื”ื‘ืงืฉื•ืช (ื’ื ื›ืืœื” ืœื“ืคื™ื ืฉื”ื•ื ืœื ืžื›ื™ืจ) ื•ืชืžื™ื“ ื™ื—ื–ื™ืจ ืืช ืงื•ื‘ืฅ ื” HTML ื”ืจืืฉื™ ืฉืœ ื”ืืคืœื™ืงืฆื™ื”. ื‘ื“ื•ื’ืžืื•ืช ื‘ืคื•ืกื˜ ื–ื” ื‘ืฉื‘ื™ืœ ืœื ืœื”ืชืขืกืง ืขื ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“ ืฆื“ ืฉืจืช ืื ื™ ืืฉืชืžืฉ ื‘ Hash History. ืืชื ืชืจืื• ืฉื‘ Vue ืžืื•ื“ ืงืœ ืœื‘ื—ื•ืจ ื‘ื™ืŸ ื”ืฉื ื™ื™ื, ื•ื›ืฉืชืจื’ื™ืฉื• ืžื•ื›ื ื™ื ืœืฉื ื•ืช ืืช ืงื•ื“ ืฆื“ ื”ืฉืจืช ื›ืš ืฉื’ื ื™ืชืื™ื ืœืžื‘ื ื” ืฉืœ Single Page App ืชื•ื›ืœื• ืœื”ื—ืœื™ืฃ ืœ History API ื”ื—ื“ืฉ ื™ื•ืชืจ. ## ื™ืฆื™ืจืช SPA ืจืืฉื•ืŸ ืขื Vue Router ืื—ืจื™ ื›ืœ ืžื” ืฉื“ื™ื‘ืจื ื• ืขืœ Single Page Applications ื”ื’ื™ืข ื”ื–ืžืŸ ืœืจืื•ืช ื“ื•ื’ืžื” ืœืื—ื“ ื›ื–ื” ื‘ืืžืฆืขื•ืช Vue ื• Vue Router. ื”ืชื—ื™ืœื• ื‘ื™ืฆื™ืจืช ืคืจื•ื™ืงื˜ Vue ื•ื”ื•ืกื™ืคื• ืœื• ืืช vue-router ืขื ื”ืคืงื•ื“ื”:
yarn add vue-router@4
ืฉื™ืžื• ืœื‘ ืฉื ื›ื•ืŸ ืœื›ืชื™ื‘ืช ื”ืคื•ืกื˜ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื vue-router ื‘ื’ื™ืจืกื” 3 ื”ื™ืฉื ื” ื™ื•ืชืจ ื•ืœื›ืŸ ืื ื™ ืžืฉืชืžืฉ ื‘ @ ื›ื“ื™ ืœืงื—ืช ืืช ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื”. ื‘ืฉื‘ื™ืœ ืœื›ืชื•ื‘ ื™ื™ืฉื•ื Single Page ืขื Vue Router ืื ื™ ื‘ืกืš ื”ื›ืœ ืฆืจื™ืš ืœื˜ืคืœ ื‘ืžืกืคืจ ื ืงื•ื“ื•ืช: 1. ืื ื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืื™ื–ื” ื ืชื™ื‘ื™ื ื”ืืคืœื™ืงืฆื™ื” ืฉืœื™ ืžื›ื™ืจื” 2. ืื ื™ ืฆืจื™ืš ืœืืชื—ืœ ืืช ืืคืœื™ืงืฆื™ื™ืช ื” Vue ืฉืœื™ ื•ืœื”ื•ืกื™ืฃ ืืœื™ื” ืืช Vue Router ืขื ืจืฉื™ืžืช ื”ื ืชื™ื‘ื™ื 3. ืื ื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืงื•ืžืคื•ื ื ื˜ื” ืžื™ื•ื—ื“ืช ืฉืœ vue-router ืฉื ืงืจืืช router-link ื›ื“ื™ ืœื ื•ื•ื˜ ื‘ื™ืŸ ื“ืคื™ื 4. ืื ื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืงื•ืžืคื•ื ื ื˜ื” ืžื™ื•ื—ื“ืช ืฉืœ vue-router ืฉื ืงืจืืช router-view ื›ื“ื™ ืœื”ืฆื™ื’ ืชื•ื›ืŸ ืฉืœ ื“ืฃ ืฉืžืฉืชื ื” ื›ืฉืžืฉืชืžืฉื™ื ืขื•ื‘ืจื™ื ื‘ื™ืŸ URL-ื™ื. ื‘ื•ืื• ื ืจืื” ืืช ืืจื‘ืขืช ื”ื ืงื•ื“ื•ืช ื‘ืงื•ื“. ืชื—ื™ืœื” ื‘ืงื•ื‘ืฅ main.js ื ื›ืชื•ื‘ ืืช ื”ืงื•ื“ ื”ื‘ื:
import { createApp } from 'vue';
import * as VueRouter from 'vue-router';

import Home from './components/Home';
import About from './components/About';
import Contact from './components/Contact';
import App from './App.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
  { path: '/contact', component: Contact },
];

const router = VueRouter.createRouter({
  history: VueRouter.createWebHashHistory(),
  routes,
});

createApp(App)
  .use(router)
  .mount('#app')
ืœืื—ืจ ืžื›ืŸ ื ืžืฉื™ืš ืœื™ืฆื™ืจืช ื”ืงื•ืžืคื•ื ื ื˜ื•ืช: ื‘ืงื•ื“ ืื ื™ ืžืชื™ื—ืก ืœ-3 ืงื•ืžืคื•ื ื ื˜ื•ืช ื‘ืฉื Home, About ื• Contact. ื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ืœื ืฆืจื™ื›ื” ืœื›ืœื•ืœ ื™ื•ืชืจ ืžื“ื™ ืงื•ื“ ื•ื–ื• ื“ื•ื’ืžื” ืœืงื•ืžืคื•ื ื ื˜ืช Home ืืฆืœื™:
<template>
  <p>This is my homepage</p>
</template>

<script>
export default {
  name: "Home",
};
</script>
ื•ื‘ืกื™ื•ื ื ืขื“ื›ืŸ ืืช ื”ืงื•ื‘ืฅ App.vue ืœืชื•ื›ืŸ ื”ื‘ื:
<template>
  <div class="container">
    <nav>

ToCode
1 419
# ืžื“ืจื™ืš Vue ืœืžืชื—ื™ืœื™ื - ื—ืœืง 6 - ื™ื™ืฉื•ืžื™ Single Page Apps ืขื Vue Router ื•ื™ื• ื”ื™ื ืกืคืจื™ื” ืœืคื™ืชื•ื— ื™ื™ืฉื•ืžื™ ืฆื“-ืœืงื•ื— ืžื•ืจื›ื‘ื™ื. ื‘ืฉื‘ื•ืขื•ืช ื”ืื—ืจื•ื ื™ื ืื ื™ ืžืคืจืกื ืœืื˜ ืžื“ืจื™ืš Vue ืœืžืชื›ื ืชื™ Front End ืฉืจื•ืฆื™ื ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ืขื ื”ืกืคืจื™ื”. ืขื“ ื›ื” ืคื•ืจืกืžื• ื”ืคืจืงื™ื: 1. ืคืจืง 1 - ืคื™ืชื•ื— ืงื•ืžืคื•ื ื ื˜ื” ืจืืฉื•ื ื” 2. ืคืจืง 2 - ืชืงืฉื•ืจืช ื‘ื™ืŸ ืงื•ืžืคื•ื ื ื˜ื•ืช 3. ืคืจืง 3 - ืชื‘ื ื™ื•ืช ื“ื™ื ืืžื™ื•ืช 4. ืคืจืง 4 - ืžืžืฉืง ื”ื”ืจื›ื‘ื” Composition API 5. ืคืจืง 5 - ื“ื•ื’ืžืช ืคื™ืชื•ื— ื ื’ืŸ YouTube ื‘ Vue ืื ืขื‘ืจืชื ืขืœ ื›ืœ ื”ื—ืœืงื™ื ืืชื ื›ื‘ืจ ืฆืจื™ื›ื™ื ืœื”ื‘ื™ืŸ ืœื ืจืข ืžื” ื›ืœ ื”ืžื”ื•ืžื” ืกื‘ื™ื‘ Vue ื•ื’ื ืžืกื•ื’ืœื™ื ื›ื‘ืจ ืœื‘ื ื•ืช ื™ื™ืฉื•ืžื™ื ื‘ืกื™ืกื™ื™ื. ื‘ืคืจืง ื”ื™ื•ื ื ื“ื‘ืจ ืขืœ Vue Router ื•ื ืจืื” ืžื”ื ื™ื™ืฉื•ืžื™ ืขืžื•ื“-ื™ื—ื™ื“ ื•ืื™ืš Vue ืขื•ื–ืจ ืœื ื• ืœื‘ื ื•ืช ื›ืืœื” ื‘ืงืœื•ืช. ## ืžื”ื• Single Page App ืื—ืช ื”ืžื”ืคื›ื•ืช ื”ืžืขื ื™ื™ื ื•ืช ื‘ืคื™ืชื•ื— ื•ื•ื‘ ื”ื™ื” ื”ืžืขื‘ืจ ืžืคื™ืชื•ื— "ืืชืจื™ื" ืœืคื™ืชื•ื— "ืืคืœื™ืงืฆื™ื•ืช". ื”ืชื”ืœื™ืš ื”ื–ื” ื”ื•ืฉืคืข ืžืžืกืคืจ ืคื™ืชื•ื—ื™ื ืžืงื‘ื™ืœื™ื, ืžืฆื“ ืื—ื“ ืฉื™ืคื•ืจื™ื ื‘ื™ื›ื•ืœื•ืช ืฉืœ ื“ืคื“ืคื ื™ื ืื™ืคืฉืจื• ืœื›ืชื•ื‘ ื™ื™ืฉื•ืžื™ื ืขื ืงื•ื“ JavaScript ืžืื•ื“ ืžื•ืจื›ื‘, ื•ืžืฆื“ ืฉื ื™ ื”ื”ืฉืจืื” ืฉืงื™ื‘ืœื• ืžืคืชื—ื™ ื•ื•ื‘ ืžืขื•ืœื ื” Mobile ื•ืžื”ืคื•ืคื•ืœืจื™ื•ืช ืฉืœ ื—ื•ื•ื™ืช ื”ืžืฉืชืžืฉ ื‘ืชื•ืš ืืคืœื™ืงืฆื™ื•ืช ื‘ื˜ืœืคื•ื ื™ื. ืžื” ืฉืžื™ื•ื—ื“ ื‘ืืคืœื™ืงืฆื™ื•ืช, ื‘ื™ืŸ ืื ื‘ื˜ืœืคื•ื ื™ื ืื• ื‘ื“ืคื“ืคื ื™ื, ื”ื•ื ืฉืืคืœื™ืงืฆื™ื” ืฉื•ืžืจืช ืขืœ ืงื•ื ื˜ืงืกื˜. ื”ืžืขื‘ืจื™ื ื‘ื™ืŸ ื“ืคื™ื ื‘ืืชืจ ื•ื•ื‘ ืฉืœ ืคืขื ื›ืœืœื• ื˜ืขื™ื ื” ืฉืœ ืงื•ื‘ืฅ HTML ื—ื“ืฉ ื•ืื™ืชื• ืงื‘ืฆื™ CSS ื• JavaScript ื•ื’ื ื”ืจืฆื” ืžื—ื“ืฉ ืฉืœ ื›ืœ ืงื•ื“ ื” JavaScript ืฉืœ ื”ืขืžื•ื“. ื–ื” ืื•ืžืจ ืฉื‘ื™ืŸ ืœื—ื™ืฆื” ืขืœ ืงื™ืฉื•ืจ ืœื”ืžืฉืš ืขื‘ื•ื“ื” ื‘ื“ืฃ ื”ื‘ื ืื ื—ื ื• ืžื—ื›ื™ื ืœื˜ืขื™ื ื” ืฉืœ ื”ื“ืฃ ื”ื—ื“ืฉ ื•ืงื•ื˜ืขื™ื ืืช ื”ืจืฆืฃ. ื‘ื”ืฉื•ื•ืื”, ื‘ืืคืœื™ืงืฆื™ื•ืช ื’ื ืคืขื•ืœื•ืช ื‘ืชื•ืš ื“ืคื™ื ื•ื’ื ืžืขื‘ืจ ืœื“ืคื™ื ืื—ืจื™ื ืงื•ืจื™ื ื‘ืฆื•ืจื” ืžื™ื™ื“ื™ืช. ื‘ืชื•ืš ื“ืคื“ืคืŸ ื”ืงื•ื ืกืคื˜ ืฉืœ ืฉื™ื ื•ื™ ืจืง ื—ืœืงื™ื ืžื”ืขืžื•ื“ ื”ื™ื” ื‘ืฉื™ืžื•ืฉ ืขื•ื“ ืžืื–ื•ืจ 2005 ื•ื–ื›ื” ืœืฉื Ajax. ืื‘ืœ ืจืง ืž 2010, ื‘ืžืงื‘ื™ืœ ืœืคื•ืคื•ืœืจื™ื•ืช ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ื‘ืžื•ื‘ื™ื™ืœ, ืžืชื›ื ืชื™ื ื”ื—ืœื• ืœื—ืฉื•ื‘ ื‘ืจืฆื™ื ื•ืช ืขืœ ืฉื™ื ื•ื™ ื”ืขืžื•ื“ ื›ื•ืœื• ื‘ Ajax ื›ื“ื™ ืœืชืช ื—ื•ื•ื™ืช ืžืฉืชืžืฉ ืžื™ื™ื“ื™ืช ื‘ืžืขื‘ืจื™ื ื‘ื™ืŸ ื“ืคื™ื. ืฉื™ื ื•ื™ ื–ื” ืžื‘ื™ื ืื™ืชื• ื’ื ื”ื–ื“ืžื ื•ื™ื•ืช ื•ื’ื ืืชื’ืจื™ื: ื‘ืฆื“ ื”ื”ื–ื“ืžื ื•ื™ื•ืช ื›ืฉืื ื™ ืžื—ืœื™ืฃ ืจืง ืืช ืชื•ื›ืŸ ื”ื“ืฃ ื‘ Ajax ืื ื™ ืฆืจื™ืš ืœื˜ืขื•ืŸ ื”ืจื‘ื” ืคื—ื•ืช ืžื™ื“ืข ืžื”ืฉืจืช (ืœื ืฆืจื™ืš ืœื˜ืขื•ืŸ ืืช ื›ืœ ื” HTML ื•ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืฉืกื‘ื™ื‘ื•); ืื‘ืœ ื‘ืฆื“ ื”ืืชื’ืจื™ื ืฆืจื™ืš ืœื–ื›ื•ืจ ืฉื“ืคื“ืคื ื™ื ืœื ื ื•ืขื“ื• ืœืฉื™ื˜ืช ืขื‘ื•ื“ื” ื–ื•, ื•ืœื›ืŸ ืงื•ื“ JavaScript ืฆืจื™ืš ืœืžืœื ืชืคืงื™ื“ื™ื ืฉื‘ืื•ืคืŸ ืจื’ื™ืœ ืขื•ืฉื” ื“ืคื“ืคืŸ ื›ื“ื•ื’ืžืช ืืคืฉืจื•ืช ืœื“ืคื“ื•ืฃ ืื—ื•ืจื” ื‘ื“ืคื™ื, ืืคืฉืจื•ืช ืœืฉืžื™ืจืช ื“ืฃ ืžืกื•ื™ื ืžื”ืืชืจ ื‘ืชื•ืจ ืกื™ืžื ื™ื”, ืฉืžื™ืจื” ืขืœ ืžื™ืงื•ื ื”ื’ืœื™ืœื” ื‘ื˜ืขื™ื ื” ืžื—ื“ืฉ ืฉืœ ืขืžื•ื“ ืื‘ืœ ื’ืœื™ืœื” ืœืจืืฉ ื”ืขืžื•ื“ ื‘ืžืขื‘ืจ ื‘ื™ืŸ ืขืžื•ื“ื™ื ื•ืžืฉื™ืžื•ืช ื ื•ืกืคื•ืช ื‘ืกื’ื ื•ืŸ ื–ื”. ื‘ืื–ื•ืจ ืฉื ืช 2015 ืคืจื“ื™ื’ืžืช ืคื™ืชื•ื— Web Applications ื”ื—ืœื” ืœืฆื‘ื•ืจ ืคื•ืคื•ืœืจื™ื•ืช ืื‘ืœ ืื– ืขื•ื“ ื”ื™ื” ืงืฉื” ืœื‘ื ื•ืช ืืคืœื™ืงืฆื™ื•ืช ื›ืืœื” ื›ื™ ืจื•ื‘ ื›ืœื™ ื”ืคื™ืชื•ื— ื•ื”ืกืคืจื™ื•ืช ืฉื”ื™ื• ื‘ืฉื™ืžื•ืฉ ื ื•ืขื“ื• ืœื‘ื ื™ื™ืช ืืชืจื™ื - ื‘ื”ื ืงื•ื‘ืฅ HTML ืžื™ื™ืฆื’ ื“ืฃ ื‘ืืชืจ ื•ื’ืœื™ืฉื” ืœื“ืฃ ืื—ืจ ืžื—ื™ื™ื‘ืช ืžืขื‘ืจ ืœืงื•ื‘ืฅ HTML ืื—ืจ. ื›ืฉืคืจื™ื™ืžื•ื•ืจืงืก ืคื™ืชื•ื— ื•ื•ื‘ ื”ื—ืœื• ืœื”ื•ืคื™ืข ืื—ืช ื”ื”ื‘ื˜ื—ื•ืช ืฉืœื”ืŸ ื”ื™ืชื” ืœื”ืคื•ืš ืืช ืชื”ืœื™ืš ืคื™ืชื•ื— ื”"ืืคืœื™ืงืฆื™ื”" ืœื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ื•ืœื“ืื•ื’ ื‘ืฉื‘ื™ืœื ื• ืœื›ืœ ืžืฉื™ืžื•ืช ื”ื ื™ื•ื•ื˜ ื‘ืžืงื•ื ื”ื“ืคื“ืคืŸ. ื‘ืขื•ืœื ืฉืœ ื”ื™ื•ื ื”ืจื‘ื” ืคืขืžื™ื ื›ื‘ืจ ื™ื•ืชืจ ืงืœ ืœื›ืชื•ื‘ Web Application ืžืืฉืจ "ืืชืจ" ืงืœืืกื™, ื‘ื’ืœืœ ืฉื›ืœื™ ื”ืคื™ืชื•ื— ืžื•ืชืืžื™ื ืœื’ื™ืฉื” ื–ื•. ื”ืžืืคื™ื™ื ื™ื ื”ืžืจื›ื–ื™ื™ื ืฉืœ Single Page Application ื”ื: 1. ื“ืฃ HTML ื™ื—ื™ื“ ืฉืœื ืžื›ื™ืœ ืชื•ื›ืŸ, ื•ืงื•ื“ JavaScript ืฉืื—ืจืื™ ืขืœ ืžื™ืœื•ื™ ื”ืชื•ื›ืŸ ืขืฆืžื•. 2. ื” URL ืžืฉืชื ื” ื‘ื”ืชืืžื” ืœืชื•ื›ืŸ ื”ืžืฉืชื ื” ืขืœ ื”ืžืกืš, ืœืžืจื•ืช ืฉืื™ืŸ ื˜ืขื™ื ื” ืฉืœ ื“ืฃ HTML ื—ื“ืฉ. 3. ืžืขื‘ืจ ื‘ื™ืŸ ื“ืคื™ื ื”ื•ื ืžื™ื™ื“ื™ ืื• ื›ืžืขื˜ ืžื™ื™ื“ื™, ื•ื—ืœืงื™ื ื‘ืขืžื•ื“ ื™ื›ื•ืœื™ื ืœื”ื™ืฉืืจ ืงื‘ื•ืขื™ื ืœืžืจื•ืช ื”ืžืขื‘ืจ. 4. ื‘ื“ืจืš ื›ืœืœ ืขื‘ื•ื“ื” ื‘ืชื•ืš Framework ืฉื“ื•ืื’ ืœืžืœื ืืช ื”ืชืคืงื™ื“ ืฉืœ ื”ื“ืคื“ืคืŸ ื›ืฉืขื‘ืจื ื• ืœื’ื™ืฉื” ื–ื•. ื‘ Vue ื”ืกืคืจื™ื” ืฉืขื•ื–ืจืช ืœื ื• ืœื‘ื ื•ืช Single Page Applications ื ืงืจืืช Vue Router. ื‘ืžื“ืจื™ืš ื–ื” ื ืจืื” ืื™ืš ืœื”ืชืงื™ืŸ ืื•ืชื” ื•ืื™ืš ืœื‘ื ื•ืช ื‘ืืžืฆืขื•ืชื” ื™ื™ืฉื•ืžื™ ืขืžื•ื“ ื™ื—ื™ื“. ## ื”ื”ื‘ื“ืœ ื‘ื™ืŸ Hash Navigation ืœ History Navigation ื‘ื™ื™ืฉื•ืžื™ ืขืžื•ื“ ื™ื—ื™ื“ ื” URL ืžืฉืชื ื” ื™ื—ื“ ืขื ื”ืชื•ื›ืŸ ืฉืžืฉืชื ื” ืขืœ ื”ืžืกืš, ืื‘ืœ ืชืงื•ืคื” ืืจื•ื›ื” ื•ื‘ื–ืžืŸ ืฉืžืชื›ื ืชื™ื ื›ื‘ืจ ื›ืชื‘ื• ื™ื™ืฉื•ืžื™ Single Page ื“ืคื“ืคื ื™ื ืขื“ื™ื™ืŸ ืœื ืื™ืคืฉืจื• ืœื ื• ืœืฉื ื•ืช ืืช ื” URL ื‘ืœื™ ืœื˜ืขื•ืŸ ื“ืฃ ื—ื“ืฉ. ื‘ืฉื‘ื™ืœ ืœื”ืชืžื•ื“ื“ ืขื ื–ื” ื”ืฉืชืžืฉื ื• ื‘"ืžืขืงืฃ" ืฉื ืงืจื Hash. ื‘ HTML ืชื’ื™ืช a ื”ื™ื ืงื™ืฆื•ืจ ืฉืœ ื”ืžื™ืœื” anchor ืื• ืขื•ื’ืŸ. ื›ืžื• ืฉื”ื™ื ืžื™ื™ืฆื’ืช ืงื™ืฉื•ืจ ื”ื™ื ื’ื ื™ื›ื•ืœื” ืœื™ื™ืฆื’ ืืช ื”ื™ืขื“ ืฉืืœื™ื• ืžืงืฉืจื™ื, ืื• ืืช ื”ืขื•ื’ืŸ ืขืœ ื”ืขืžื•ื“ ืฉืืœื™ื• ืื ื—ื ื• ืจื•ืฆื™ื ืœืœื›ืช. ืื ืชื›ืชื‘ื• ื‘ื›ืœ ืžืงื•ื ื‘ื“ืฃ HTML ืืช ื”ืชื•ื›ืŸ:
<a name="tasks">Tasks</a>

ToCode
1 419
# ื–ื” ื™ืขื‘ื•ื“ ื‘ืกื•ืฃ ื“ืจืš ืคื•ืคื•ืœืจื™ืช ืœื™ืฆื•ืจ ืงื•ื“ ื’ืจื•ืข ื”ื™ื ืœื™ืคื•ืœ ื‘ืžืœื›ื•ื“ืช ื”ืœื—ืฅ. ื–ื” ืขื•ื‘ื“ ื›ื›ื”, ืืช ืขื•ื‘ื“ืช ืขืœ ืคื™ืฆ'ืจ ื•ืœื ื‘ื˜ื•ื—ื” ืขื“ื™ื™ืŸ ืฉื”ื“ืจืš ืฉื‘ื—ืจืช ื”ื™ื ื”ื“ืจืš ื”ื ื›ื•ื ื”. ื•ืื– ืืช ืื•ืžืจืช ืœืขืฆืžืš: "ืื ื™ ื™ื›ื•ืœื” ืœื›ืชื•ื‘ ืืช ื”ืคื™ืฆ'ืจ ื”ื–ื” ื›ืžื• ืฉืฆืจื™ืš ืขื ื—ืœื•ืงื” ื ื›ื•ื ื” ืœืคื•ื ืงืฆื™ื•ืช ื•ืžื—ืœืงื•ืช ื•ืขื ืชื™ืขื•ื“ ื•ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื”, ืขื ื˜ื™ืคื•ืœ ืžืกื•ื“ืจ ื‘ืฉื’ื™ืื•ืช ื•ืขื ื›ืชื™ื‘ืช ืฉืื™ืœืชืช SQL ื ื›ื•ื ื”, ืื‘ืœ, ืื ืื ื™ ื‘ื“ืจืš ื”ืœื ื ื›ื•ื ื” ื•ื”ื›ื™ื•ื•ืŸ ื”ื–ื” ืœื ื™ื‘ื™ื ืื•ืชื™ ืœืคื™ืชืจื•ืŸ ืฉืขื•ื‘ื“ ืื– ืจืง ื‘ื–ื‘ื–ืชื™ ื–ืžืŸ, ืœื›ืŸ ืขื“ื™ืฃ ืœื™ ืœื›ืชื•ื‘ ืžืฉื”ื• ืžื”ืจ ืจืง ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืฉื–ื” ืขื•ื‘ื“ ื•ืื—ืจ ื›ืš ืื—ื–ื•ืจ ืœืชืงืŸ". ืื—ืจื™ ืฉื”ื›ืœ ืขื•ื‘ื“ ืžืกืชื‘ืจ ืฉื›ื‘ืจ ืœื ื›ืœ ื›ืš ืงืœ ืœืžืฆื•ื ื–ืžืŸ ื•ืžื•ื˜ื™ื‘ืฆื™ื” ืœื—ื–ื•ืจ ืœืชืงืŸ, ื•ื›ื›ื” ื ืฉืืจื™ื ืขื ืคื™ืชืจื•ื ื•ืช ื—ืฆื™ ืืคื•ื™ื™ื. ื”ืืœื˜ืจื ื˜ื™ื‘ื” ื”ื™ื ืœื›ืชื•ื‘ ืจืง ืงื•ื“ ืฉืื ื—ื ื• ื’ืื™ื ื‘ื• ื•ืœืคืชื•ืจ ื‘ืขื™ื•ืช ื›ืฉื”ืŸ ืžื•ืคื™ืขื•ืช - ื•ืคื” ื™ืฉ ืฉื ื™ ื™ืชืจื•ื ื•ืช: ื”ืจืืฉื•ืŸ ื•ื”ื‘ืจื•ืจ ื”ื•ื ืฉืื™ืŸ ืกื™ื›ื•ื™ ืœื”ื™ืชืงืข ืขื ืงื•ื“ ื’ืจื•ืข ื›ื™ ื”ื•ื ืžืจืืฉ ืœื ื ื›ืชื‘. ื”ืฉื ื™ ื•ื”ื™ื•ืชืจ ื—ืฉื•ื‘, ื”ื•ื ืฉืœืื˜ ืœืื˜ ื”ื›ืชื™ื‘ื” ืฉืœ ืงื•ื“ ื˜ื•ื‘ ื ื”ื™ื™ืช ืงืœื” ื™ื•ืชืจ ื•ืืช ืœื•ืžื“ืช ืœืคืชื•ืจ ื‘ืขื™ื•ืช ื˜ื•ื‘ ื™ื•ืชืจ ื•ืžื”ืจ ื™ื•ืชืจ. (ื ื‘ื”ื™ืจ: ืœื›ืชื•ื‘ ืงื•ื“ ืฉืื ื—ื ื• ื’ืื™ื ื‘ื• ื–ื” ืœื ืื•ืžืจ ืœืคืชื•ืจ ืืช ื›ืœ ื‘ืขื™ื•ืช ื”ืขื•ืœื ืžืจืืฉ ื•ืœืคื ื™ ืฉื”ืŸ ืžื•ืคื™ืขื•ืช. ื–ื” ื‘ืกืš ื”ื›ืœ ืื•ืžืจ ืœื›ืชื•ื‘ ืงื•ื“ ืฉืœื, ืœื›ืชื•ื‘ ืงื•ื“ ืฉืœื ื™ืคืฉืœ ื‘ืžืขื‘ืจ ืœืคืจื•ื“ืงืฉืŸ, ืฉืœื ื™ื™ืคื•ืœ ื‘ืื™ื ืกื•ืฃ ืžืงืจื™ ืงืฆื”, ื•ืฉื™ื”ื™ื” ืืคืฉืจ ืœื”ืกืชืžืš ืขืœื™ื•. ื“ื•ื’ืžื” ืœืงื•ื“ ืจืข ื”ื™ื ืœื”ืฉืื™ืจ ืืช ื”ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช ืื• ืžืงืจื™ ืงืฆื” ืœืขืชื™ื“, ืื• ืœื•ื•ืชืจ ืขืœ ื•ื•ืœื™ื“ืฆื™ื” ืฉืœ ืงืœื˜ ื›ื“ื™ ืœื›ืชื•ื‘ ืื•ืชื” ื™ื•ื ืื—ื“ ื›ืฉื™ื”ื™ื” ื–ืžืŸ. ืืœื” ื“ื‘ืจื™ื ืฉื‘ืœืขื“ื™ื”ื ื”ืงื•ื“ ืœื ื‘ืืžืช ืขื•ื‘ื“ ืืœื ืจืง ื ืจืื” ืขื•ื‘ื“; ืžืฆื“ ืฉื ื™ ืงื•ื“ ื˜ื•ื‘ ื™ื›ื•ืœ ืœื›ืœื•ืœ Duplication ื•ืœื”ืฉืื™ืจ ืœืขืชื™ื“ ื”ื—ืœื˜ื” ืขืœ ืื‘ืกื˜ืจืงืฆื™ื” ืžืกื•ื™ืžืช, ื•ื›ืžื•ื‘ืŸ ืฉืœื ื—ื™ื™ื‘ื™ื ืœืžืžืฉ ืืช ื›ืœ ื”ืคื™ืฆ'ืจื™ื ื‘ืžื›ื” ืื—ืช. ื›ืœืœ ืืฆื‘ืข ืžื•ืขื™ืœ ื›ืืŸ ื”ื•ื ืœืฉืื•ืœ, ืื ืžื—ืจ ืื ื™ ืขื•ื–ื‘ ืืช ื”ืคืจื•ื™ืงื˜ ื•ื™ื‘ื•ื ื‘ืŸ ืื“ื ืื—ืจ ืœื”ื—ืœื™ืฃ ืื•ืชื™, ืžื” ื”ื•ื ื™ื—ืฉื•ื‘ ืขืœื™ื™ ื›ืฉื™ืงืจื ืืช ื”ืงื•ื“).

ToCode
1 419
# ืื™ืคื•ืจ ื•ืื‘ื˜ื—ืช ืžื™ื“ืข ื”ื ืœื ื”ื•ืœื›ื™ื ื‘ื™ื—ื“, ื•ื”ื‘ืขื™ื” ืฉื”ืื™ืคื•ืจ ืจืง ืžื—ืžื™ืจ ืืช ื”ืžืฆื‘. ื ืคืœืชื™ ื‘ืžืงืจื” ืขืœ ื”ื“ืฃ ื”ื–ื” ื”ื™ื•ื: https://docs.npmjs.com/docker-and-private-modules ื–ื” ืžืชื•ืš ื”ืชื™ืขื•ื“ ืฉืœ npm. ื”ื“ืฃ ืžืกื‘ื™ืจ ืื™ืš ืœื™ืฆื•ืจ ืงื•ื‘ืฅ .npmrc ื‘ืชื•ืจ Docker Image, ืœืžืฉืœ ื‘ืฉื‘ื™ืœ ืœืžืฉื•ืš ืื™ืžื’' ืžืžืื’ืจ ืคืจื˜ื™. ื”ื ืžืžืœื™ืฆื™ื ืœื”ืฉืชืžืฉ ื‘ Dockerfile ื”ื‘ื:
FROM risingstack/alpine:3.3-v4.3.1-3.0.1
ARG NPM_TOKEN
COPY .npmrc .npmrc
COPY package.json package.json
RUN npm install
RUN rm -f .npmrc
# Add your source files
COPY . .
CMD npm start
ื•ื‘ืชื‘ื ื™ืช ื”ื‘ืื” ืขื‘ื•ืจ npmrc:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
ืฉื™ืžื• ืœื‘ ืœืื™ืคื•ืจ: ืœื ื›ื•ืชื‘ื™ื ืืช ื”ื˜ื•ืงืŸ ื‘ืชื•ืš ื”ืงื•ื“ ืืœื ืžืฉืชืžืฉื™ื ื‘ืžืฉืชื ื” ื•ืžื•ื—ืงื™ื ืืช ื”ืงื•ื‘ืฅ .npmrc ืื—ืจื™ ืฉื”ืฉืชืžืฉื• ื‘ื• ื›ื“ื™ ืœื”ืคืขื™ืœ npm install. ืื‘ืœ ื›ืžื•ื‘ืŸ ืฉื–ื” ืื™ืคื•ืจ ื›ื™ ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื›ืœ ืคืงื•ื“ื” ืฉืžืจื™ืฆื™ื ื‘ืชื•ืš Dockerfile ื ืฉืžืจืช ื‘ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื”ืื™ืžื’'. ืชื•ื›ืŸ ื”ืžืฉืชื ื” NPM_TOKEN ื™ื”ื™ื” ื’ืœื•ื™ ืœื›ืœ ืžื™ ืฉื™ืฉ ืœื• ืืช ื”ืื™ืžื’', ื‘ื“ื™ื•ืง ื›ืžื• ืฉื”ื™ื” ืื ื”ื™ื™ื ื• ืคืฉื•ื˜ ืฉื•ืžืจื™ื ืืช ื”ืงื•ื‘ืฅ .npmrc ืขื ื”ื˜ื•ืงืŸ ื‘ืชื•ืš ื”ืื™ืžื’'. ื‘ืฉื‘ื™ืœ ื”ืžืฉื—ืง ืœืงื—ืชื™ ืืช ื” Dockerfile ืฉืœื”ื ื•ื‘ื ื™ืชื™ ืžืžื ื• ืื™ืžื’' ื•ื’ื ืคื™ืจืกืžืชื™ ืื•ืชื” ื‘ Dockerhub. ืชืจืื• ืื ืชืฆืœื™ื—ื• ืœื’ืœื•ืช ืžื” ื”ืขืจืš ืฉืœ NPM_TOKEN ื‘ื“ื•ื’ืžื” ืฉืœื™: https://hub.docker.com/layers/ynonp/dtest/latest/images/sha256-7eb4139557b15d6dd86cd5d9511863aaa03cb4271f3f799d701d5c80aa357575?context=explore&tab=layers.

ToCode
1 419
# ืื™ืš ืื ื™ ืžืจื™ืฅ ืฉืื™ืœืชืช SQL ืžืชื•ืš ื”ื“ืคื“ืคืŸ? ืฉ: ืื™ืš ืื ื™ ืžืจื™ืฅ ืฉืื™ืœืชืช SQL ืžืชื•ืš ื”ื“ืคื“ืคืŸ? ืช: ืืชื” ืœื ื•ื–ื” ืžืฉื—ืง ืฉืžืฉื ื” ืืช ื”ื›ืœ. ืจืง ืื—ืจื™ ืฉืืชื” ืจื•ืื” ืืช ื”ื‘ืขื™ื” ื•ืžื‘ื™ืŸ ื‘ืืžืช ืืช ื”ืžืฉืžืขื•ืช ืฉืœ "ืฆื“ ืฉืจืช" ื•"ืฆื“ ืœืงื•ื—" ืืคืฉืจ ืœื”ืชื—ื™ืœ ืœื“ื‘ืจ ืขืœ ื”ืคื™ืชืจื•ื ื•ืช, ืขืœ ืฉืœื™ื—ืช ื”ืฉืื™ืœืชื” ืœืฉืจืช ื•ืขืœ ื›ืœ ื”ื”ืฉืœื›ื•ืช ืฉืœ ื’ื™ืฉื” ื–ื• ืขืœ ืื‘ื˜ื—ืช ืžื™ื“ืข ื•ื‘ื™ืฆื•ืขื™ื ื•ืžื” ืฉืœื ืชืจืฆื•. ืžื’ื‘ืœื•ืช ื˜ื›ื ื™ื•ืช ื”ืŸ ืœื ืžืฉื”ื• ืฉืฆืจื™ืš "ืœืขืงื•ืฃ"; ื”ืŸ ืงื•ื“ื ื›ืœ ืžืฉื”ื• ืฉืฆืจื™ืš ืœืจืื•ืช. ืจืง ื›ืฉืื ื—ื ื• ืจื•ืื™ื ืืช ื”ื’ื‘ื•ืœื•ืช ืื ื—ื ื• ื‘ืžืงื•ื ืœื™ืฆื•ืจ ืžืขืจื›ื•ืช ื˜ื•ื‘ื•ืช ื™ื•ืชืจ.

ToCode
1 419
ื•ืžื™ืœื” ืื—ืจื•ื ื” ืขืœ ืคืขื•ืœืช ื” .value. ืฉื ื™ ื”ืžืฉืชื ื™ื playerRef ื• videoId ื”ื•ื’ื“ืจื• ื‘ืืžืฆืขื•ืช ื”ืžื™ืœื” ื”ืฉืžื•ืจื” ref. ืคื•ื ืงืฆื™ื” ื–ื• ืฉืœ vue ื™ื•ืฆืจืช ืžืฉืชื ื™ื ืฉื™ื›ื•ืœื™ื ืœืฉื ื•ืช ืืช ืขืจื›ื ื‘ืฆื•ืจื” ืจื™ืืงื˜ื™ื‘ื™ืช, ื›ืœื•ืžืจ ืฉืงื•ื“ ืื—ืจ ื™ื•ื›ืœ ืœืคืขื•ืœ ื›ืฉืžืฉืชื ื™ื ืืœื” ืžืฉื ื™ื ืืช ืขืจื›ื. ืื‘ืœ ื‘ืฉื‘ื™ืœ ืฉื–ื” ื™ืขื‘ื•ื“ ื•ื™ื• ืฆืจื™ืš ื“ืจืš ืœืฉื ื•ืช ืืช "ื”ืขืจืš" ืฉืœ ื”ืžืฉืชื ื™ื ื‘ืœื™ ืœืฉื ื•ืช ืืช ื”ืžืฉืชื ื™ื ืขืฆืžื, ื›ืœื•ืžืจ ื‘ืœื™ ืฉื”ื ื™ืขื‘ืจื• ืœื”ืฆื‘ื™ืข ืขืœ ืื•ื‘ื™ืงื˜ ืื—ืจ. ื–ืืช ื”ืžื˜ืจื” ืฉืœ ื” value. ืœื›ืœ ืื•ื‘ื™ืงื˜ ืžืกื•ื’ ref ื™ืฉ ืฉื“ื” value. ื›ืชื™ื‘ื” ืœ value ืžืขื“ื›ื ืช ืืช ื›ืœ ืžื™ ืฉืฆืจื™ืš ืฉื™ืฉ ืขืจืš ื—ื“ืฉ ื‘ืฉื“ื” ื•ื’ื•ืจืžืช ืœื”ืคืขืœืช ื—ื™ืฉื•ื‘ ืžื—ื“ืฉ ืขืœ ื›ืœ ื”ืขืจื›ื™ื ืฉืชืœื•ื™ื™ื ื‘ืฉื“ื” ื–ื”, ืื• ืœื”ืคืขืœืช ื›ืœ ืคื•ื ืงืฆื™ื•ืช ื” watch ืฉืžืชืื™ืžื•ืช ืœืฉื“ื”. ืงืจื™ืื” ืž value ืžื—ื–ื™ืจื” ืืช ื”ืขืจืš ืฉืœ ื”ืื•ื‘ื™ืงื˜. ื”ืงืจื™ืื” ื“ืจืš value ื”ื›ืจื—ื™ืช ื›ืฉืื ื—ื ื• ืงื•ืจืื™ื ืืช ื”ืขืจืš ืžืชื•ืš ืงื•ื“ Vue, ื•ื ืขืฉื™ืช ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ื›ืฉืงื•ืจืื™ื ืืช ื”ืขืจืš ืžืชื•ืš ื”ืชื‘ื ื™ืช. ื‘ื’ืœืœ ื–ื” ืฉื•ืจื” ื–ื• ืžืชื•ืš ื”ืชื‘ื ื™ืช:
<p>Loading {{videoId}}</p>
ืขื‘ื“ื” ืžืžืฉ ื‘ืกื“ืจ ื•ื”ืฆื™ื’ื” ืืช ื”ืขืจืš ื”ืืžื™ืชื™, ืื‘ืœ ื›ืฉื”ื’ืขื ื• ืœื˜ืขื•ืŸ ืืช ื”ื•ื™ื“ืื• ื‘ืงื•ื“ ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื›ืชื•ื‘:
player.loadVideoById(videoId.value);
## ืขื›ืฉื™ื• ืืชื ืื—ื“ ื”ื“ื‘ืจื™ื ื”ืฉื™ืžื•ืฉื™ื™ื ืฉืืคืฉืจ ืœืขืฉื•ืช ืขื Template Refs ื”ื•ื ื ื™ื”ื•ืœ ืคื•ืงื•ืก. ื‘ืฉื‘ื™ืœ ืœื”ืขื‘ื™ืจ ืคื•ืงื•ืก ืžืงืœื“ืช ืœืงื•ืžืคื•ื ื ื˜ื” ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืคื•ื ืงืฆื™ื” focus ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”. ื›ืชื‘ื• ืงื•ืžืคื•ื ื ื˜ื” ืฉืžืงื‘ืœืช ืžืžืฉืชืžืฉ ืžืกืคืจ ื˜ืœืคื•ืŸ ื‘ืฉื ื™ ืฉื“ื•ืช ืงืœื˜, ื‘ืฉื“ื” ื”ืจืืฉื•ืŸ ื”ืžืฉืชืžืฉ ืžืงืœื™ื“ 3 ืกืคืจื•ืช ืฉืœ ืงื™ื“ื•ืžืช ื•ืื—ืจ ื›ืš ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ื”ืคื•ืงื•ืก ืขื•ื‘ืจ ืœืฉื“ื” ื”ืฉื ื™ ื›ื“ื™ ืฉื”ืžืฉืชืžืฉ ื™ื•ื›ืœ ืœื”ืงืœื™ื“ ืืช ื”ืžืฉืš ื”ืžืกืคืจ. ืœืื—ืจ ืžื›ืŸ ื ืกื• ืœืขื“ื›ืŸ ืืช ื”ืงื•ื“ ื›ื“ื™ ืฉื” input ื”ืจืืฉื•ืŸ (ืฉืœ ื”ืงื™ื“ื•ืžืช) ื™ืชืคื•ืก ืืช ื”ืคื•ืงื•ืก ืื™ืš ืฉื”ืขืžื•ื“ ืขื•ืœื”. ื•ืฉืืœื” ืœืกื™ื•ื - ื‘ืงื•ื“ ืฉื›ืชื‘ืชื™ ืžืฉืชื ื” videoId ื”ื•ื’ื“ืจ ืœื”ื™ื•ืช ref. ืื™ื–ื” ื—ืœืง ื‘ืงื•ื“ ืœื ื”ื™ื” ืขื•ื‘ื“ ืื ืžืฉืชื ื” ื–ื” ื”ื™ื” ืžื•ื’ื“ืจ ื‘ืชื•ืจ ืžื—ืจื•ื–ืช ืจื’ื™ืœื”?

ToCode
1 419
  <p>Loading {{videoId}}</p>
  <div ref="playerRef"></div>
</template>
ืื– ืื ื™ ื™ื›ื•ืœ ื‘ืชื•ืš ืงื•ื“ ื”ืกืงืจื™ืคื˜ ืœื’ืฉืช ืœืืœืžื ื˜ DOM ืฉืžืชืื™ื ืœ div ื”ืื—ืจื•ืŸ, ื•ื™ืฉ ืœื™ ืฉืชื™ ื“ืจื›ื™ื ืœื’ืฉืช ืืœื™ื•. ืœืžื™ ืฉืขื•ื‘ื“ ื‘ Options API, ื›ืœื•ืžืจ ื‘ืžืžืฉืง ืฉื‘ื• ืžื’ื“ื™ืจื™ื ืื•ื‘ื™ืงื˜ ืฉื™ืฉ ืœื• ืฉื“ื” data ื•ืฉื“ื” methods ืขื‘ื•ืจ ื”ืงื•ืžืคื•ื ื ื˜ื”, ืื– ืืคืฉืจ ืœื’ืฉืช ืœืืœืžื ื˜ ื“ืจืš ื”ืžืฉืชื ื” this.$refs.playerRef ื‘ืชื•ืš ื”ืžืชื•ื“ื•ืช ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”. ืžื™ ืฉืขื•ื‘ื“ ื‘ Composition API ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืžืฉืชื ื” ื‘ืฉื playerRef, ืœืฉืžื•ืจ ื‘ืชื•ื›ื• ืขืจืš ืฉื—ื•ื–ืจ ืžืคื•ื ืงืฆื™ื” ื‘ืฉื ref ื•ืœื”ื—ื–ื™ืจ ืื•ืชื• ื‘ืื•ื‘ื™ืงื˜ ืฉืžื—ื–ื™ืจื™ื ืž setup. ื‘ืขื‘ื•ื“ื” ืขื ref ื™ื•ืชืจ ืžืงื•ื‘ืœ ืœืขื‘ื•ื“ ืขื ื” Composition API ื•ืœื›ืŸ ืื ื™ ืืจืื” ืืช ื”ืงื•ื“ ื‘ืฉื™ื˜ื” ื–ื•. ืื ื ื™ืฉืืจ ืขื ื”ื˜ืžืคืœื™ื™ื˜ ืžื”ื“ื•ื’ืžื” ืื– ืคื•ื ืงืฆื™ื™ืช ื” setup ืฉืชืชืื™ื ืชื™ืจืื” ื›ืš:

export default {
  name: 'YoutubePlayer',
  setup() {
    const playerRef = ref(null);

    return {
      playerRef,
    }
  }
};
ืขื“ ืขื›ืฉื™ื• ื”ืงื•ื“ ืœื ืขื•ืฉื” ื”ืจื‘ื”. ื ื›ื•ืŸ, ื™ืฉ ืœื ื• ืืช ื”ืืœืžื ื˜ ื‘ DOM ืื‘ืœ ืขื“ื™ื™ืŸ ืœื ื—ื™ื‘ืจื ื• ืื•ืชื• ืœืกืคืจื™ื”. ืื ื™ ืœื ื™ื›ื•ืœ ืœื—ื‘ืจ ืืช ื” DOM Element ืฉื ืฉืžืจ ื‘ playerRef ืœืกืคืจื™ื” ืกืชื ื‘ืชื•ืš ืคื•ื ืงืฆื™ื™ืช setup, ื‘ื’ืœืœ ืฉืคื•ื ืงืฆื™ื™ืช setup ืžื•ืคืขืœืช ืœืคื ื™ ืฉื”ืงื•ืžืคื•ื ื ื˜ื” ื ื•ืฆืจื” ื•ื‘ืขืฆื ืœืคื ื™ ืฉืืœืžื ื˜ ื” DOM ื”ื–ื” ื ื•ืฆืจ ืื™ืชื”. ืื ืื ืกื” ืœื”ืกืชื›ืœ ืขืœ playerRef ื‘ืชื•ืš ื”ืคื•ื ืงืฆื™ื” ืขืจื›ื• ื™ื”ื™ื” null. ื‘ืžืงื•ื ื–ื” ืื ื™ ืฆืจื™ืš ืœื”ื’ื™ื“ ืœ Vue ืœืขืฉื•ืช ืžืฉื”ื• ืื—ืจื™ ืฉื”ืงื•ืžืคื•ื ื ื˜ื” ื›ื‘ืจ ืขืœ ื”ืžืกืš ื•ืื—ืจื™ ืฉื™ืฉ ืœื™ ืืœืžื ื˜ DOM ื‘ื™ื“ ืฉืืคืฉืจ ืœืขื‘ื•ื“ ืื™ืชื•. ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื ื‘ Vue ื”ื•ื ื’ื ื“ื‘ืจ ืฉืžืงื•ื‘ืœ ืœืขืฉื•ืช ื‘ืชื•ืš Composition API ื•ืœื›ืŸ ืื ื™ ืฉืžื— ืฉื‘ื—ืจืชื™ ื‘ืฉื™ื˜ืช ืขื‘ื•ื“ื” ื–ื•. ื”ืื™ืจื•ืข ื”ืžืชืื™ื ื ืงืจื mount ื•ื”ื“ืจืš ืœื˜ืคืœ ื‘ื• ื”ื™ื ืœื”ืคืขื™ืœ ืคื•ื ืงืฆื™ื” ืฉืœ Vue ืฉื ืงืจืืช onMounted ื•ืœื”ืขื‘ื™ืจ ืœื” ื‘ืชื•ืจ ืคืจืžื˜ืจ ืคื•ื ืงืฆื™ื” ืฉืœื™ ืฉืชื™ืงืจื ื›ื“ื™ ืœื˜ืคืœ ื‘ืื™ืจื•ืข mount. ื”ืงื•ื“ ื”ื‘ื ืžืฆื™ื™ืจ ื ื’ืŸ ื•ื™ื“ืื• ืขืœ ื”ืืœืžื ื˜ playerRef ื‘ืขืงื‘ื•ืช ืื™ืจื•ืข mount:
import YouTubePlayer from 'youtube-player';
import { ref, onMounted } from 'vue';

export default {
  name: 'YoutubePlayer',
  setup() {
    const playerRef = ref(null);
    let player;

    onMounted(() => {
      player = YouTubePlayer(playerRef.value);
      console.log(player);
    });

    return {
      playerRef,
    }
  }
};
ื ืฉืืจื” ืœื ื• ืžืฉื™ืžื” ืื—ืจื•ื ื” ื•ื”ื™ื ื˜ืขื™ื ืช ืกืจื˜. ืฉื™ืžื• ืœื‘ ืฉื‘ื˜ืžืคืœื™ื™ื˜ ื™ืฆืจืชื™ ืฉื“ื” input ืฉืžื—ื•ื‘ืจ ืœืžืฉืชื ื” ื‘ืฉื videoId ื‘ืงื•ืžืคื•ื ื ื˜ื”. ื”ื™ื™ืชื™ ืจื•ืฆื” ืœื—ื‘ืจ ื‘ื™ืŸ ืžืฉืชื ื” ื–ื” ืœื‘ื™ืŸ ื”ืกืจื˜ ืฉืขื›ืฉื™ื• ื ืžืฆื ื‘ื ื’ืŸ: ื›ืฉื”ืžืฉืชื ื” videoId ืžืชืขื“ื›ืŸ, ื™ื™ื˜ืขืŸ ืกืจื˜ ื—ื“ืฉ ืœื ื’ืŸ ื‘ื”ืชืืžื”. ืืคืฉืจื•ืช ืื—ืช ืœื’ืฉืช ืœืžืฉื™ืžื” ื–ื• ื”ื™ื ืœื™ืฆื•ืจ ืงื•ื“ ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืข input ืฉืœ ืฉื“ื” ื”ืงืœื˜. ืจืื™ื ื• ืืช ื–ื” ื‘ืื—ื“ ื”ืžื“ืจื™ื›ื™ื ื”ืงื•ื“ืžื™ื ื•ืœื›ืŸ ืื ื™ ืœื ืืงื— ื“ืจืš ื–ื• ืฉื•ื‘. ื›ืŸ ืฆืจื™ืš ืœื”ื’ื™ื“ ืฉื”ื—ื™ืกืจื•ืŸ ืฉืœ ื’ื™ืฉื” ื–ื• ื”ื•ื ืฉืื ื™ืฉ ืžืกืคืจ ื“ืจื›ื™ื ื‘ื”ืŸ ื”ืขืจืš ืฉืœ videoId ื™ื›ื•ืœ ืœื”ืชืขื“ื›ืŸ ืื– ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืงื•ื“ ื˜ื™ืคื•ืœ ืœื›ืœ ืื—ืช ืžื”ื“ืจื›ื™ื. ื’ื™ืฉื” ืื—ืจืช ื”ื™ื ืœื™ื™ืฆืจ ืžืฉื”ื• ืฉื ืงืจื Watch. ื” watch ืžืกืชื›ืœ ืขืœ ืžืฉืชื ื™ื ืžืกื•ื™ืžื™ื ื•ืžืคืขื™ืœ ืงื•ื“ ื›ืœ ืคืขื ืฉื™ืฉ ืฉื™ื ื•ื™ ื‘ืื—ื“ ืžื”ื. ื‘ืฉื‘ื™ืœ ืœื™ืฆื•ืจ watch ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืคื•ื ืงืฆื™ื” watch ื•ืžืขื‘ื™ืจื™ื ืœื” ืฉืชื™ ืคื•ื ืงืฆื™ื•ืช: ื”ืื—ืช ืžื—ื–ื™ืจื” ืืช ื”ืžืฉืชื ื™ื ืขืœื™ื”ื ืฆืจื™ืš ืœื”ืกืชื›ืœ, ื•ื”ืฉื ื™ื” ืžื—ื–ื™ืจื” ืžื” ืœืขืฉื•ืช ืื ืื—ื“ ืื• ื™ื•ืชืจ ืžืžืฉืชื ื™ื ืืœื” ืžืชืขื“ื›ื ื™ื. ืฉื™ืžื• ืœื‘ ืœื‘ืœื•ืง ื”ื‘ื:
    watch(
      () => [videoId.value, player],
      () => {
        if (player) {
          player.loadVideoById(videoId.value);
        }
      });
ื‘ืขื‘ืจื™ืช ื–ื” ืื•ืžืจ: ืื ืžืฉืชื ื” videoId.value ืื• ืžืฉืชื ื” player ืžืฉื ื” ืืช ืขืจื›ื•, ื”ืคืขืœ ืืช ื”ืคื•ื ืงืฆื™ื” ืฉืชื‘ื“ื•ืง ืื player ืื™ื ื• null ืื– ืชื ืกื” ืœื˜ืขื•ืŸ ืืช ื”ื•ื™ื“ืื• ืฉื”ืžื–ื”ื” ืฉืœื• ืฉืžื•ืจ ื‘ videoId. ืกืš ื”ื›ืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืžืœืื” ื ืจืื™ืช ื›ืš:
<template>
  <p>A Player</p>
  <input type="text" v-model="videoId" />
  <p>Loading {{videoId}}</p>
  <div ref="playerRef"></div>
</template>

<script>
import YouTubePlayer from 'youtube-player';
import { ref, onMounted, watch } from 'vue';

export default {
  name: 'YoutubePlayer',
  setup() {
    const playerRef = ref(null);
    const videoId = ref('');
    let player;

    onMounted(() => {
      player = YouTubePlayer(playerRef.value);
    });

    watch(
      () => [videoId.value, player],
      () => {
        if (player) {
          player.loadVideoById(videoId.value);
        }
      });

    return {
      playerRef,
      player,
      videoId,
    }
  }
};
</script>

<style scope="yes">
</style>

ToCode
1 419
# ืžื“ืจื™ืš Vue ืœืžืชื—ื™ืœื™ื - ื—ืœืง 5 - ื‘ื•ืื• ื ื‘ื ื” ื ื’ืŸ YouTube ื‘ Vue ืกืคืจื™ื™ืช Vue ื”ื™ื ืกืคืจื™ื™ืช JavaScript ืœืคื™ืชื•ื— ืžื‘ื•ืกืก ืงื•ืžืคื•ื ื ื˜ื•ืช. ื”ื™ื ื ื—ืฉื‘ืช ืœืื—ืช ืžืกืคืจื™ื•ืช ื”ืคื™ืชื•ื— ื”ืคื•ืคื•ืœืจื™ื•ืช ื”ื™ื•ื ื™ื—ื“ ืขื React ื• Angular. ืžื” ืฉืžื™ื™ื—ื“ ืืช Vue ื”ื•ื ื”ืžืืžืฅ ืฉืœ ื›ื•ืชื‘ื™ื” ืœื‘ื ื•ืช ืžืžืฉืง ืฉื™ื”ื™ื” ืžืื•ื“ ื™ื“ื™ื“ื•ืชื™ ืœืื ืฉื™ื ื—ื“ืฉื™ื ื•ื™ืืคืฉืจ ื›ื ื™ืกื” ืงืœื” ืœืขื•ืœื ืฉืœ ืงื•ืžืคื•ื ื ื˜ื•ืช. ืคืจืง ื–ื” ื”ื•ื ื”ืคืจืง ื”ื—ืžื™ืฉื™ ื‘ืžื“ืจื™ืš. ืืœื” ื”ื—ืœืงื™ื ื”ืงื•ื“ืžื™ื: 1. ืคืจืง 1 - ืคื™ืชื•ื— ืงื•ืžืคื•ื ื ื˜ื” ืจืืฉื•ื ื” 2. ืคืจืง 2 - ืชืงืฉื•ืจืช ื‘ื™ืŸ ืงื•ืžืคื•ื ื ื˜ื•ืช 3. ืคืจืง 3 - ืชื‘ื ื™ื•ืช ื“ื™ื ืžื™ื•ืช 4. ืคืจืง 4 - ืžืžืฉืง ื”ื”ืจื›ื‘ื” Composition API ื‘ืคืจืง ื”ื™ื•ื ื ืจืื” ืื™ืš ืœืขื˜ื•ืฃ ืงื•ื“ ืงื™ื™ื ื‘ืชื•ืจ ืงื•ืžืคื•ื ื ื˜ืช Vue ื•ื“ืจืš ื–ื” ื ืœืžื“ ืœืกื ื›ืจืŸ ื‘ื™ืŸ ื”ืขื•ืœื ืฉืœ Vue ืœืขื•ืœื ืฉืœ ืคื™ืชื•ื— JavaScript ืฉืื™ื ื• ืžื‘ื•ืกืก ืงื•ืžืคื•ื ื ื˜ื•ืช. ## ื”ืชืงื ืช Vue ื•ืคื™ืชื•ื— ืคืจื•ื™ืงื˜ ื—ื“ืฉ ืขืœ ื”ืžื›ื•ื ื” ืฉืœื™ ืื—ืจื™ ืืจื‘ืขื” ืคืจืงื™ื ืฉืœ ื”ืžื“ืจื™ืš ืื ื™ ืžืจื’ื™ืฉ ืฉื”ื’ื™ืข ื”ื–ืžืŸ ืœื”ื™ืคืจื“ ืž Code Sandbox ื•ืœืขื‘ื•ืจ ืœืขื‘ื•ื“ ืขืœ ื”ืžื—ืฉื‘ ื”ืžืงื•ืžื™ ืฉืœื›ื. ื”ืžืขื‘ืจ ืœืขื‘ื•ื“ื” ืžืงื•ืžื™ืช, ื’ื ืื ืœื ื ื•ืชืŸ ืœื ื• ื™ื›ื•ืœื•ืช ื—ื“ืฉื•ืช, ืžืงืจื‘ ืื•ืชื ื• ืœืฉื™ื˜ืช ื”ืขื‘ื•ื“ื” ืฉืœ ื”ืกืคืจื™ื” ื‘ืขื•ืœื ื”ืืžื™ืชื™ ื•ืœื›ืŸ ืื ื™ ื—ื•ืฉื‘ ืฉืฉื•ื•ื” ืืช ื”ื”ืฉืงืขื”. ื‘ืฉื‘ื™ืœ ืœื”ืชื—ื™ืœ ืคืจื•ื™ืงื˜ Vue ืžืื•ื“ ื ื•ื— ืœื”ืชืงื™ืŸ ืืช ื›ืœื™ ื”ืคื™ืชื•ื— ืฉืœื”ื ืœืกื‘ื™ื‘ืช ื” CLI. ื‘ื”ื ื—ื” ืฉื™ืฉ ืœื›ื Node.JS ืžื•ืชืงืŸ ืชืฆื˜ืจื›ื• ืœื”ืคืขื™ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
$ npm install -g @vue/cli
ืจืง ืคืขื ืื—ืช ืขืœ ื”ืžื›ื•ื ื” ืฉืœื›ื. ืื—ืจ ื›ืš ืชื•ื›ืœื• ื‘ื›ืœ ืชื™ืงื™ื” ืฉืชืจืฆื• ืœื›ืชื•ื‘ npx vue create ื•ืœืื—ืจ ืžื›ืŸ ืฉื ืฉืœ ืชื™ืงื™ื” ื›ื“ื™ ืœื™ืฆื•ืจ ืชื‘ื ื™ืช ืคืจื•ื™ืงื˜ ืœืื•ืชื” ืชื™ืงื™ื”. ืœื“ื•ื’ืžื” ืื ื™ ืจื•ืฆื” ืœื™ืฆื•ืจ ืคืจื•ื™ืงื˜ ืฉืœ ื ื’ืŸ ื•ื™ื“ืื• ื•ืœื›ืŸ ืื ื™ ืžืคืขื™ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
$ npx vue create video-player
ื”ืคืขืœื” ื›ื–ืืช ืชืฆื™ื’ ืชืคืจื™ื˜ ื‘ื• ืชื•ื›ืœื• ืœื‘ื—ื•ืจ ืืช ืกื•ื’ ื”ืคืจื•ื™ืงื˜. ืื ื™ ื‘ื•ื—ืจ ืคืจื•ื™ืงื˜ Starter ืขื Vue 3, Babel, eslint ื• jest. ื‘ืชื•ืš ืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื”ืงื•ื‘ืฅ ื”ืจืืฉื•ืŸ ืฉืžืขื ื™ื™ืŸ ืื•ืชื ื• ื”ื•ื package.json ื•ื”ื‘ืœื•ืง ื”ืžืขื ื™ื™ืŸ ื‘ื• ื”ื•ื ื‘ืœื•ืง scripts:
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "test:unit": "vue-cli-service test:unit",
    "lint": "vue-cli-service lint"
  },

ื•ื™ื• ื™ืฆืจ 4 ืกืงืจื™ืคื˜ื™ื: ื”ืคืงื•ื“ื” serve ืžืคืขื™ืœื” ืฉืจืช ืœืžืฆื‘ ืคื™ืชื•ื—, ื”ืคืงื•ื“ื” build ื‘ื•ื ื” ืืช ื”ืคืจื•ื™ืงื˜ ืœืชื™ืงื™ื” ืžืงื•ืžื™ืช (dist), ื”ืคืงื•ื“ื” test:unit ืžืจื™ืฆื” ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ื• lint ื‘ื•ื“ืงืช ืกื˜ื˜ื™ืช ืืช ื”ืงื•ื“. ื”ืคืขื™ืœื•:
$ yarn serve
ื•ืชื•ื›ืœื• ืœื”ื™ื›ื ืก ื‘ื“ืคื“ืคืŸ ืœืžื—ืฉื‘ ื”ืžืงื•ืžื™ ื‘ืคื•ืจื˜ 8080 ื›ื“ื™ ืœืจืื•ืช ืืช ื“ืฃ ื”ืคืชื™ื—ื”. ## ื”ืชืงื ืช ืกืคืจื™ื™ืช youtube-player ื‘ืืžืฆืขื•ืช yarn ืื ื—ื ื• ืจื•ืฆื™ื ืœื‘ื ื•ืช ื ื’ืŸ ื•ื™ื“ืื• ื•ื‘ืขืฆื ืœืขื˜ื•ืฃ ืกืคืจื™ื™ืช JavaScript ืงื™ื™ืžืช ืฉื ืงืจืืช youtube-player. ืฆืขื“ ืจืืฉื•ืŸ ื™ื”ื™ื” ืœื”ืชืงื™ืŸ ืืช ื”ืกืคืจื™ื”. ื‘ืขื‘ื•ื“ื” ืขื ืคืจื•ื™ืงื˜ Vue ืžืกื•ื’ Starter ืื ื—ื ื• ืžืชืงื™ื ื™ื ื—ื‘ื™ืœื•ืช JavaScript ืž npm. ื”ื—ื‘ื™ืœื•ืช ื™ื™ืฉืžืจื• ื‘ืชื™ืงื™ื™ืช node_modules ื‘ืชื•ืš ืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื•ื‘ืขืช ื”ื‘ื ื™ื” ืืœื” ืžื”ืŸ ืฉื ืžืฆืื•ืช ื‘ืฉื™ืžื•ืฉ ื™ื•ืขืชืงื• ืœืชื™ืงื™ื™ืช dist. ื ืชืงื™ืŸ ืืช ื”ืกืคืจื™ื” youtube-player ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื”:
$ yarn add youtube-player
ื•ืชื•ื›ืœื• ืœืจืื•ืช ืฉื”ืกืคืจื™ื” ื”ืฆื˜ืจืคื” ืœืจืฉื™ืžืช ื”ืชืœื•ื™ื•ืช ื‘ืงื•ื‘ืฅ package.json ื•ื’ื ื ื™ืชืŸ ืœืžืฆื•ื ืืช ื”ืงื•ื“ ืฉืœื” ื‘ืชื™ืงื™ื™ืช node_modules ืฉื‘ืชื•ืš ืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜. ## ื›ืชื™ื‘ืช ื”ืงื•ื“ ืœืงื•ืžืคื•ื ื ื˜ืช Youtube Player ื ื™ื›ื ืก ืœืงื•ื“ ื”ืคืจื•ื™ืงื˜, ื ืžื—ืง ืืช ื”ืงื•ื‘ืฅ HelloWorld.vue ื•ื‘ืžืงื•ืžื• ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื YoutubePlayer.vue. ืขื›ืฉื™ื• ืžืชื—ื™ืœ ื”ื›ื™ืฃ. ื‘ืฉื‘ื™ืœ ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ืช youtube-player ืื ื™ ืฆืจื™ืš: 1. ืœื˜ืขื•ืŸ ืื•ืชื” ื‘ืืžืฆืขื•ืช import 2. ืœื™ืฆื•ืจ ืื•ื‘ื™ืงื˜ YoutubePlayer ื•ืœื”ืขื‘ื™ืจ ืืœื™ื• ืืœืžื ื˜ ืžื” DOM 3. ื›ืฉืืจืฆื” ืœื˜ืขื•ืŸ ืกืจื˜ ืœืžืฆื•ื ืืช ืื•ื‘ื™ืงื˜ ื” YoutubePlyaer ืฉื™ืฆืจืชื™ ื•ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” loadVideoById ืฉืœื•. ื”ืžืฉื™ืžื” ื”ืจืืฉื•ื ื” ื”ื™ื ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ. ื‘ืชื—ื™ืœืช ื‘ืœื•ืง ื”ืกืงืจื™ืคื˜ ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืืช ื”ืคืงื•ื“ื”:
import YouTubePlayer from 'youtube-player';
ื•ืขื›ืฉื™ื• ื”ืขื ื™ื™ื ื™ื ืžืชื—ื™ืœื™ื ืœื”ืกืชื‘ืš. ืกืคืจื™ื™ืช youtube-player ืจื•ืฆื” ืฉืืขื‘ื™ืจ ืืœื™ื” ืื•ื‘ื™ืงื˜ DOM, ืื‘ืœ ืงื•ื“ Vue ืฉืื ื™ ื›ื•ืชื‘ ืขื•ื‘ื“ ืขืœ "ืžื™ื“ืข" ื•ืขืœ "ืžืฉืชื ื™ื", ื•ื”ืื—ืจื™ื•ืช ืขืœ ื”ืคื™ื›ืช ื”ื˜ืžืคืœื™ื™ื˜ ืœ DOM ื”ื™ื ืืฆืœ ื•ื™ื•. ืœืฉืžื—ืชื ื• ื™ืฉ ืœื™ ื’ื™ืฉื” ืœืžื ื’ื ื•ืŸ ื–ื” ื‘ืฆื•ืจืช ืžื ื’ื ื•ืŸ ืฉื ืงืจื Template Refs, ื•ื–ื” ืขื•ื‘ื“ ื›ื›ื”: ืื ื™ ื›ื•ืชื‘ ื‘ืชื•ืš ืืœืžื ื˜ ื‘ื˜ืžืคืœื™ื™ื˜ ืžืืคื™ื™ืŸ ref ื•ืžืขื‘ื™ืจ ื‘ืชื•ืจ ืขืจืš ืฉื ืฉืœ ืžืฉืชื ื”. ื•ื™ื• ื‘ืชื•ืจื• ื™ืฉืžื•ืจ ื‘ืชื•ืš ื”ืžืฉืชื ื” ื”ื–ื” ืืช ืืœืžื ื˜ ื” DOM ืฉืžืชืื™ื ืœืืœืžื ื˜ ื‘ื˜ืžืคืœื™ื™ื˜ ืฉื™ืฉ ืœื• ref. ื‘ืงื•ื“ ื–ื” ืื•ืžืจ ืฉืื ื‘ื˜ืžืคืœื™ื™ื˜ ืื ื™ ืจื•ืฉื:
<template>
  <p>A Player</p>
  <input type="text" v-model="videoId" />

ToCode - Estadรญsticas y analรญtica del canal de Telegram @tocodeil