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

Vuexで覚える状態管理

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for arm4 arm4
December 25, 2017

 Vuexで覚える状態管理

Avatar for arm4

arm4

December 25, 2017
Tweet

More Decks by arm4

Other Decks in Technology

Transcript

  1. 親コンポーネント 親コンポーネント resources/assets/js/components/ProductList.vue <template> <div id="product-list" class="row"> <div class="col-md-8 col-md-offset-2">

    <product v-for="product in productList" :product="product </div> </div> </template> <script> import Product from './Product.vue' export default { components: { Product, },
  2. 子コンポーネント 子コンポーネント resources/assets/js/components/Product.vue <template> <div class="panel panel-default"> <div class="panel-body"> <div

    class="row"> <div class="col-md-6">{{ product.name }}</div> <div class="col-md-6 text-right"> 価格 {{ product.price }}円 <button class="btn btn-default"><i class="fas fa-c </div> </div> </div> </div> </template> <script>
  3. 子コンポーネント 子コンポーネント resources/assets/js/components/Product.vue <template> <div class="panel panel-default"> <div class="panel-body"> <div

    class="row"> <div class="col-md-6">{{ product.name }}</div> <div class="col-md-6 text-right"> 価格 {{ product.price }}円 <button class="btn btn-default" @click="add"><i c </div> </div> </div> </div> </template> <script>
  4. 親コンポーネント 親コンポーネント resources/assets/js/components/ProductList.vue <template> <div id="product-list" class="row"> <div class="col-md-8 col-md-offset-2">

    <product v-for="product in productList" :product="product <div class="text-right">合計点数 {{ total.count }}点 合計 { </div> </div> </template> <script> import Product from './Product.vue' export default { components: { Product, }
  5. app.js app.js require('./bootstrap'); window.Vue = require('vue'); import ProductList from './components/ProductList.vue'

    import CartLabel from './components/CartLabel.vue' const app = new Vue({ el: '#app', components: { ProductList, CartLabel, }, });
  6. コンポーネントProduct コンポーネントProduct resources/assets/js/components/Product.vue <template> <div class="panel panel-default"> <div class="panel-body"> <div

    class="row"> <div class="col-md-6">{{ product.name }}</div> <div class="col-md-6 text-right"> 価格 {{ product.price }}円 <button class="btn btn-default" @click="add"><i c </div> </div> </div> </div> </template> <script>
  7. コンポーネントCartLabel コンポーネントCartLabel resources/assets/js/components/CartLabel.vue <template> <a class="btn btn-default" href="#"> <i class="fas

    fa-shopping-cart"></i> <span class="badge b </a> </template> <script> export default { data() { return { count: 0, price: 0, } }, created() {
  8. コンポーネントProductList コンポーネントProductList resources/assets/js/components/ProductList.vue <template> <div id="product-list" class="row"> <div class="col-md-8 col-md-offset-2">

    <product v-for="product in productList" :product="product <div class="text-right">合計点数 {{ total.count }}点 合計 { </div> </div> </template> <script> import Product from './Product.vue' export default { components: { Product, }
  9. 共通で使うデータやそれを更新するメソッドは new Vuex.Store でインスタンス化しておく const store = new Vuex.Store({ state:

    { total: { count: 0, price: 0, }, productList: [ { name: ' ', price: 140, onSale: true, }, { name: ' ', price: 300, onSale: true
  10. app.js app.js require('./bootstrap'); window.Vue = require('vue'); import Vuex from 'vuex'

    Vue.use(Vuex) import store from './store/vuex' import VxProductList from './components/VxProductList.vue' import VxCartLabel from './components/VxCartLabel.vue' const vxApp = new Vue({ el: '#app', store
  11. コンポーネントVxProduct コンポーネントVxProduct resources/assets/js/components/VxProduct.vue this.$store はVuex ストアのインスタンス <template> <div class="panel panel-default">

    <div class="panel-body"> <div class="row"> <div class="col-md-6">{{ product.name }}</div> <div class="col-md-6 text-right"> 価格 {{ product.price }}円 <button class="btn btn-default" @click="add"><i c </div> </div> </div> </div> </template> <script>
  12. コンポーネントVxCartLabel コンポーネントVxCartLabel resources/assets/js/components/VxCartLabel.vue this.$store はVuex ストアのインスタンス <template> <a class="btn btn-default"

    href="#"> <i class="fas fa-shopping-cart"></i> <span class="badge b </a> </template> <script> import { mapState } from 'vuex' export default { computed: { total() { return this.$store.state.total; }, }, }
  13. コンポーネントVxProductList コンポーネントVxProductList resources/assets/js/components/VxProductList.vue this.$store はVuex ストアのインスタンス <template> <div id="product-list" class="row">

    <div class="col-md-8 col-md-offset-2"> <vx-product v-for="product in productList" :product="produ <div class="text-right">合計点数 {{ total.count }}点 合計 { </div> </div> </template> <script> import { mapState, mapGetters } from 'vuex' import VxProduct from './VxProduct.vue' export default { components: { VxProduct
  14. store を作成する store を作成する ※ 事前にVue とVuex を読み込んでおく(require or import)

    必要があります。 const store = new Vuex.Store({ state: { count: 1 }, mutations: { increment (state) { // 状態 変更 state.count++ } } })
  15. Vue のルートインスタンスにstore オプ Vue のルートインスタンスにstore オプ ションを追加 ションを追加 ※ ここで

    store, となっているのは、ECMAScript 2015 で 変数名とオブジェクトのkey 名が同一の場合は省略できるという文法が追加になったためであり、 省略しない表記は store: store, です。 ※ store オプションのvalue にはVuex ストアのインスタンスを渡す必要があるので、ストアのインスタンス 生成はVue のルートインスタンスより前に行っておく必要があります。 const app = new Vue({ el: '#app', store, components: { VxProductList, VxCartLabel, }, });
  16. ▼私が書いたLaravel+Vuex+Vue のサンプルコード ※ Vx のpre x ついてるコンポーネントのファイルがvuex 版 ※ assets/js/store

    にjs をModule 化して分けて入れたり、mutations などのプロパティ別でファイルを分け て整理するとかするといいかもしれない。 https://github.com/fromarm4/vuex_study