Upgrade to Pro — share decks privately, control downloads, hide ads and more …

From Traditional Web to Modern Web

From Traditional Web to Modern Web

Neo Kusanagi

July 19, 2018
Tweet

More Decks by Neo Kusanagi

Other Decks in Technology

Transcript

  1. var app = new Vue({ el: '#app', data: { message:

    'Hello Vue!' } }) <div id="app"> {{ message }} </div>
  2. Prod M Prod P Prod N Prod U Prod S

    Prod J Prod A Prod E Prod V
  3. product-list.cshtml <div class="prod-list"> @foreach (var item in Model.Products) { <div

    class="@item.ProdCategoryClass"> @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  4. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  5. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  6. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  7. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  8. Prod M Prod P Prod N Prod U Prod S

    Prod J Prod A Prod E Prod V
  9. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  10. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  11. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  12. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  13. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  14. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  15. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  16. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  17. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  18. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ Resource.New }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  19. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } else if (item.IsSoldOut) { <div class="sold-out-ribbon">@Resource.SoldOut</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  20. <div class="prod-list"> @foreach (var item in Model.Products) { <div class="@item.ProdCategoryClass">

    @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  21. <div id="vue-scope" class="prod-list"> @foreach (var item in Model.Products) { <div

    class="@item.ProdCategoryClass"> @if (item.IsNew) { <div class="new-ribbon">@Resource.New</div> } <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  22. <div id="vue-scope" class="prod-list"> @foreach (var item in Model.Products) { <div

    class="@item.ProdCategoryClass"> <div v-if="@item.IsNew.ToString().ToLower()" class="new-ribbon"> @Resource.New </div> <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  23. <div id="vue-scope" class="prod-list"> @foreach (var item in Model.Products) { <div

    class="@item.ProdCategoryClass"> <div v-if="@item.IsNew.ToString().ToLower()" class="new-ribbon"> @Resource.New </div> <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div> v-if="true" or v-if="false"
  24. <div id="vue-scope" class="prod-list"> @foreach (var item in Model.Products) { <div

    class="@item.ProdCategoryClass"> <div v-if="@item.IsNew.ToString().ToLower()" class="new-ribbon"> @Resource.New </div> <div v-else-if="@item.IsSoldOut.ToString().ToLower()" class="sold-out-ribbon"> @Resource.SoldOut </div> <div class="prod-img [email protected]@item.ImgLang" style="background-image: url(@Model.ImgCdnUrl/@[email protected])" title="@item.Name"></div> <span class="prod-name" data-pid="@item.ProdId">@item.Name</span> <a href="/providers/@item.ProviderId">@item.Provider</a> </div> } </div>
  25. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">@Resource.New</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(@Model.ImgCdnUrl/${item.iconPath}[email protected])`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  26. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">@Resource.New</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(@Model.ImgCdnUrl/${item.iconPath}[email protected])`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: { products: null }, created() { $.ajax('/api/products').done((data) => { this.products = data }); }, }); </script>
  27. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">@Resource.New</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script>
  28. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">@Resource.New</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script> “sensitive data”
  29. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">@Resource.New</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script> “sensitive data” public class DemoViewModel { [JsonIgnore] public string SensitiveData }
  30. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">@Resource.New</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script>
  31. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ _resource.new }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ mixins: [$resource], el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script> <script> var $resource = { data: function() { return { _resource: { new: "@Resource.New", }, }; }, }; </script>
  32. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ _resource.new }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ mixins: [$resource], el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script> <script> var $resource = { data: function() { return { _resource: { new: "@Resource.New", }, }; }, }; </script>
  33. <div id="vue-scope" class="prod-list"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew"

    class="new-ribbon">{{ _resource.new }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </div> <script> var vueApp = new Vue({ mixins: [$resource], el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script> <script> var $resource = { data: function() { return { _resource: { new: "@Resource.New", }, }; }, }; </script>
  34. <div id="vue-scope" class="prod-list"> <item-component v-for="item in products" :item="item" :img-cdn-url="ImgCdnUrl" :img-version="ImgVersion"

    /> </div> <script> var vueApp = new Vue({ el: '#vue-scope’, data: @Html.Raw(JsonConvert.SerializeObject(Model)), }); </script>
  35. <template id="item-template"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew" class="new-ribbon">{{

    _resource.new }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </template> <script> var ItemComponent = Vue.component('item-component', { template: '#item-template', mixins: [$resource], props: ['item', 'imgCdnUrl', 'imgVersion'], }); </script>
  36. <template id="item-template"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew" class="new-ribbon">{{

    _resource.new }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </template> <script> var ItemComponent = Vue.component('item-component', { template: '#item-template’, mixins: [$resource], props: ['item', 'imgCdnUrl', 'imgVersion'], }); </script>
  37. <template id="item-template"> <div v-for="item in products" :class="item.prodCategoryClass"> <div v-if="item.isNew" class="new-ribbon">{{

    _resource.new }}</div> <div :class="['prod-img', `prod-img${item.id}-${item.imgLang}`]" :style="`background-image: url(${imgCdnUrl}/${item.iconPath}?${imgVersion})`" :title="item.name"></div> <span class="prod-name" :data-pid="item.prodId">{{ item.name }}</span> <a :href="`/providers/${item.providerId}`">{{ item.provider }}</a> </div> </template> <script> var ItemComponent = Vue.component('item-component', { template: '#item-template’, mixins: [$resource], props: ['item', 'imgCdnUrl', 'imgVersion'], }); </script>