vuex的简单练习

博客内容提及Vuex,Vuex是前端开发中重要的状态管理模式,能集中存储应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:vuex

<!DOCTYPE html>

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta content="always" name="referrer">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    <script type="text/javascript" src="https://unpkg.com/vuex@3.0.1/dist/vuex.js"></script>
</head>
<body>
    <div id="app">
        <h1>{{message}}</h1>
        <span>count:{{this.$store.state.count}}</span>
        <span>点击次数:{{clickCount}}</span>
        <button @click='addOne'>增一</button>
        <ul>
            <template v-for='item in this.$store.getters.todoList'>
                <li>{{item.name}}</li>
            </template>
        </ul>
    </div>

    <script type="text/javascript">
        // import { mapState } from 'vuex';

        Vue.use(Vuex);

        const store = new Vuex.Store({
            state:{
                count:0,
                todos : [
                    {id:1,name:'eat'},
                    {id:2,name:'sleep'},
                    {id:3,name:'speak'},
                    {id:4,name:'play'}
                ]
            },
            getters:{
                todoList : _state => {
                    return _state.todos.filter(function(item,index,arr){
                        return item.id > 2;
                    });
                }
            },
            //mutations只处理同步方法(不是说不能处理异步,只是异步不利于调试等等)
            mutations:{
                increment(_state,step){
                    _state.count += step;
                }
            },
            //mutations和actions的不同之处在于
            //1.Action提交的是mutation,而不是直接更改状态
            //2.Action可以包含任意异步操作
            actions : {
                //使用参数结构来简化代码:var {p,q} = {p:42,q:true}
                //incrementAction({commit}){
                //  commit('increment');
                //}
                incrementAction(context,p){
                    //context是一个类似于store的对象,使用它可以直接调用store下的内容
                    //但context并不是store
                    context.commit('increment',p.step);
                }
            }
        });

        const vue = new Vue({
            store,
            el:'#app',
            data(){
                return {
                    message:'测试vuex',
                }
            },
            // computed : {
            //  clickCount(){
            //      return store.state.count;
            //  }
            // },
            computed : {
                test(){},
                //使用扩展运算符进行混入
                ...Vuex.mapState({
                    //箭头函数
                    //clickCount: state => state.count,
                    clickCount : 'count'
                    //如果需要使用到this,则需要使用原始function方法
                    //clickCount(state){return state.count;}
                }),
                //使用混入方式,进行getters注入
                ...Vuex.mapGetters({

                })
            },
            methods:{
                addOne(){
                    //store.state.count++;这样也可以达到效果,但是不提倡
                    //提交mutation
                    store.commit('increment',10);

                    //分发action
                    //action的分发和mutation的提交极其相似
                    //支持如下对象方式,或者('incrementAction',{})或者('incrementAction',4)
                    store.dispatch({
                        type:'incrementAction',
                        step:4
                    });

                }
            }
        });
    </script>
</body>
</html>
### 构建简单 Vue 商城项目 #### 创建 Vue 项目 为了建立一个简单的 Vue 商城项目,可以按照如下方式创建一个新的 Vue 项目: 通过命令行工具,在目标文件夹内执行以下命令来初始化新项目[^2]: ```bash vue create simple-mall ``` 建议在此过程中选择手动配置项目选项,并启用一些常用的特性如Router和Vuex。 #### 安装依赖库 安装 Element Plus 图标和其他必要的UI框架组件以便于快速搭建界面: ```bash npm install @element-plus/icons-vue ``` 这一步骤有助于简化前端设计工作并提供丰富的交互控件支持[^1]。 #### 配置基础结构 利用 Visual Studio Code 或其他代码编辑软件打开刚刚创建好的 `simple-mall` 文件夹。接着依照需求调整项目的初始设置,比如在 `main.js` 中加载 ElementPlus 和其CSS资源,同时移除不必要的默认组件以保持整洁的工作空间: ```javascript import { createApp } from 'vue' import App from './App.vue' import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; const app = createApp(App); app.use(ElementPlus); app.mount('#app'); ``` #### 设计目录布局 根据实际业务逻辑规划合理的文件夹架构对于大型应用程序尤为重要。为此可以在 src 下面新增 api, utils 及 views 这三个子文件夹分别用来放置 API 请求处理程序、辅助方法以及视图层组件。 #### 实现商品列表展示功能 作为入门级别的练习,可以从实现基本的商品浏览页面做起。先定义好数据模型(Product),再编写相应的网络请求函数获取远程服务器上的产品信息;最后借助 Vue 的响应式机制把这些数据显示到界面上去。 例如,在 `views/ProductsList.vue` 内部可以通过 Axios 发起 GET 请求取得 JSON 数据源之后绑定至模板变量上显示出来: ```html <template> <div class="products"> <el-card v-for="(item,index) in products" :key="index"> <img :src="item.image_url"/> <h3>{{ item.name }}</h3> <p>Price: {{ item.price }} CNY</p> </el-card> </div> </template> <script setup> import axios from "axios"; import { ref,onMounted} from "vue"; let products=ref([]); onMounted(async ()=>{ try{ let response=await axios.get('/api/products') products.value=response.data; } catch(error){ console.error('Failed to fetch product data',error) } }) </script> ``` 此段代码展示了如何结合Vue Composition API 来完成异步调用服务端API的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值