Vue 基础之单文件组件 todoList、vue-router 路由和 vuex

Vue 基础之单文件组件 todoList、vue-router 路由和 vuex,第1张

一、Vue 基础之单文件组件 todoList、vue-router 路由和 vuex 单文件组件实现 todoList,如下所示:
// App.vue
<template>
  <div>
    <input v-model="inputValue" />
    <button class="button" @click="handleAddItem">提交</button>
  </div>
  <ul>
    <list-item
      v-for="(item, index) in list"
      :key="index"
      :msg="item"
    />
  </ul>
</template>

<script>
import { reactive, ref } from 'Vue';
import ListItem from './components/ListItem';

export default {
  name: 'App',
  components: { ListItem },
  setup() {
    const inputValue = ref('');
    const list = reactive([]);
    
    const handleAddItem = () => {
      list.push(inputValue.value);
      inputValue.value = '';
    };
    return { handleAddItem, inputValue, list }
  }
}

</script>

<style>
  .button {
     margin-left: 20px;
     color: red;
  }
</style>

// ListItem.vue
<template>
  <li>{{ msg }}</li>
</template>

<script>
export default {
  name: 'ListItem',
  props: {
    msg: String
  }
}
</script>

<style>
</style>
路由是指根据 url 的不同,展示不同的内容。import 是异步加载路由,router-link 是跳转路由的标签,router-view 负责展示当前路由对应的组件内容,如下所示:
<template>
  <div id="nav">
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
    <router-link to="/login">Login</router-link>
  </div>
  <router-view />
</template>

<style></style>
Vuex 数据管理框架,Vuex 创建了一个全局唯一的仓库,用来存放全局的数据。mutation 里面只允许写同步代码,不允许写异步代码。commitmutation 做关联,dispatchactions 做关联。想改变数据,vuex 要求第一步,dispatch 方法,必须派发一个 action,名字叫做 change。第二步,store 感知到触发了一个叫做 changeaction,执行 storeactions 下面的 change 。第三步,commit 提交一个叫做 change 的数据改变,mutation。第四步,对应的 mutation 感知到提交的 change 改变,执行 change 方法改变数据,如下所示:
// store index.js
import { createStore } from 'vuex'

export default createStore({
  state: {
    name: 'Tom'
  },
  mutations: {
    change(state, str) {
      state.name = str;
    }
  },
  actions: {
    change(store, str) {
      setTimeout(() => {
        store.commit('change', str)
      }, 2000)
    }
  },
  modules: {
  }
})
<template>
  <div class="home">
    <h1>{{myName}}</h1>
  </div>
</template>

<script>
export default {
  name: 'Home',
  computed: {
    myName() {
      return this.$store.state.name;
    }
  },
  methods: {
    handleClick() {
      this.$store.dispatch('change');
      // this.$store.commit('change', 'hello world')
    }
  }
}
</script>

<style>
</style>

CompositionAPI 中结合 axios 使用 Vuex,如下所示:
// store index.js
import { createStore } from 'vuex'
import axios from 'axios';

export default createStore({
  state: { name: 'Tom' },
  mutations: {
    changeName(state, str) {
      state.name = str;
    }
  },
  actions: {
    getData(store) {
      axios.post('www.baidu.com').then((response) => {
        const msg = response.data.message;
        store.commit('changeName', msg)
      })
      /**
      setTimeout(() => {
        store.commit('changeName', 'hello')
      }, 2000)
      **/
    }
  }
})

<template>
  <div class="about">
    <h1 @click="handleClick">page</h1>
    <h1>{{name}}</h1>
  </div>
</template>

<script>
import { toRef } from 'vue';
import { useStore } from 'vuex';

export default {
  name: 'Home',
  setup() {
     const store = useStore();
     const { name } = toRefs(store.state);
     const handleClick = () => {
       store.dispatch('getData')
     }
     return { name, handleClick }
  }
}

</script>

<style>
</style>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1321208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存