Vuex的基本使用

1、Vue中的Vuex

Vuex是一个专门为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生改变。


执行顺序.png
注意:

Vuex中禁止直接在组件中通过this.$store.state.name = 'test'去修改Vuex中state的数据值,这样会导致后期的调试非常困难,因为多个组件直接修改同一个共享的数据的话,那么就无法定位到哪个组件修改导致后期出了问题,所以,Vuex中修改数据必须通过Mutation函数,且该函数为同步的。

1、state

state是单一状态树,每一个应用将仅仅包含一个store实例,使用方法:
this.$store.state.状态名称

...mapState(["title"])

2、getter

getters可以从store中的state中派生出一些状态,getters的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。可以将getters理解为store的计算属性。使用方法:
this.$store.getters.计算属性名称
...mapGetters(["getNames"])

3、mutations()

mutation方法是用于更改Vuex的store中的状态的唯一方法,即提交至mutation。
mutation是同步函数,使用方法:

  mutations: {
    // 同步函数的方法名
    // state为Vuex的数据,payload为外部传过来的数据,也称之为‘载荷’
    showFilmDetail(state,payload){
      state.filmDetail = payload; // 修改Vuex中的filmDetail对象
    }
  },
4、actions()

actions方法是用于更改Vuex的store中的状态的异步操作方法,该区域内部执行的是异步操作,比如:调取后台接口,写定时器等等,执行完异步操作后,会再次提交至mutation,mutation再去修改数据的状态。

使用Vuex存储电影id

电影列表组件:

<template>
  <div class="film">
    <div  class="my-film" >
      <ul >
        <li v-for="item in filmsList"  :key="item.filmId" @click="handleSwitch(item)">
          <!-- 内容显示区 -->
          <div class="film-item" >
            <!-- 左侧图片 -->
            <div class="film-img">
              <img :src="item.poster" alt="" />
            </div>
            <!-- 右侧详情 -->
            <div class="film-detail">
              <!-- 上侧电影名称 -->
              <div class="film-top">
                <span>{{ item.name }}</span>
                <p>{{ item.filmType.name }}</p>
              </div>
              <!-- 电影主演 -->
              <div class="film-bottom">
                <div>
                  <p v-if="item.grade">
                    观众评分
                    <span style="color: #ff5f16">{{ item.grade }}</span>
                  </p>
                </div>
                <div>
                  主演:
                  <span v-for="el in item.actors" :key="el.id"
                    >{{ el.name }}&nbsp;&nbsp;</span
                  >
                </div>
                <div>
                  <span>{{ item.nation }}</span> |
                  <span>{{ item.runtime + "分钟" }}</span>
                </div>
              </div>
            </div>
            <!-- 按钮 -->
            <div class="buy-ticket">
              <div class="buy-ticket-btn">购票</div>
            </div>
          </div>
        </li>
      </ul>
    </div>
  </div>
</template>
<script>
import axios from "axios";
import BScroll from "better-scroll";
export default {
  data() {
    return {
      pn: 1,
      filmHeght: 0,
      filmsList: [],
    };
  },
  mounted() {
    // this.filmHeght = document.documentElement.clientHeight - 81 + "px";
    axios({
      url: `https://m.maizuo.com/gateway?cityId=430100&pageNum=${this.pn}&pageSize=20&type=1&k=8865930`,
      headers: {
        "X-Client-Info":
          '{"a":"3000","ch":"1002","v":"5.0.4","e":"16244625763360511261409281"}',
        "X-Host": "mall.film-ticket.film.list",
      },
    }).then((res) => {
      this.filmsList = res.data.data.films;
      // 滚动加载
      this.$nextTick(() => {
        var myScroll = new BScroll(".my-film", {
          scrollbar: {
            fade: true, // 淡入淡出
            interactive: false, //新增
          },
          pullUpLoad: {
            threshold: 50,
          },
        });
        myScroll.on("pullingUp", () => {
          console.log("到底了");
        });
      });
    });
  },
  methods: {
    handleSwitch(row) {
      this.$router.push("/about");
      this.$store.commit("showFilmDetail", row);
    },
  },
};
</script>

电影详情组件:

<template>
  <div class="film-detail">
    <div class="film-card">
      <div class="detail-top">
        <img class="detail-top-img" :src="filmDetail.poster" alt="" />
      </div>
      <div class="detail-bottom-text">
        <div class="film-name">
          <span>{{ filmDetail.name }}</span>
          <span>{{ filmDetail.filmType.name }}</span>
        </div>
        <div class="film-type">
          <span>{{ filmDetail.category }}</span>
        </div>
        <div class="film-grade" v-if="filmDetail.grade">
          <span>观众评分: </span>
          <span>{{ filmDetail.grade }}</span>
        </div>
        <div class="film-nation">
          <span>{{ filmDetail.nation }}</span> | 分钟
        </div>
        <div class="film-synopsis">
          <div>
            {{ filmDetail.synopsis }}
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import axios from "axios";
export default {
  data() {
    return {
      filmId: this.$store.state.filmDetail.filmId,
      filmDetail: {},
      time: new Date().getTime(),
    };
  },
  methods: {},
  mounted() {
    // 请求接口数据
    axios({
      url: `https://m.maizuo.com/gateway?filmId=${this.filmId}&k=${this.time}`,
      headers: {
        "X-Client-Info":
          '{"a":"3000","ch":"1002","v":"5.0.4","e":"16244625763360511261409281"}',
        "X-Host": "mall.film-ticket.film.info",
      },
    }).then((res) => {
      let data = res.data.data;
      this.filmDetail = data.film;
    });
    console.log(this.filmDetail.poster);
  },
};
</script>

由于空间有限,未贴出css样式代码,展示的即为该部分的效果。

Vuex的基本使用.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 使用 在 Vue 的单页面应用中使用,需要使用Vue.use(Vuex)调用插件。使用非常简单,只需要将其注入到V...
    胡不归vac阅读 15,641评论 0 14
  • 原文:https://laylawang17.github.io/2020/03/11/Vuex%E7%9A%84...
    FoxLayla阅读 721评论 0 0
  • 首先我们知道组件之间共享数据的方式有以下几种:父向子传值:v-bind属性绑定子向父传值:v-on 事件绑定兄弟组...
    肖青荣阅读 471评论 0 4
  • 使用 在 Vue 的单页面应用中使用,需要使用Vue.use(Vuex)调用插件。使用非常简单,只需要将其注入到V...
    前端阿峰阅读 1,696评论 0 0
  • 1.Vuex概述 Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享 使用Vuex...
    王玉伟的伟阅读 333评论 0 0