Vuex怎么学(二)

【Vuex】Vuex详解,一篇文章搞懂Vuex详细使用过程和代码编写 实现组件全局(数据)管理的一种机制,可以方便的实现组件之间共享数据,不同于上述三种传递值的方式。可以把vuex当成一个store仓库,可以集中管理共享的数据,并且存储在vuex中的数据都是响应式的,数据与页面同步。一般情况下,只有组件之间共享的数据,才有必要存储到vuex中;对于组件中的私有数据,依旧存储在组件自身的data中。 阅读详情

Vuex怎么学(二)

  • 一个项目做完了,回头再来看看vuex这个坑,以加深对vuex的印象,如果你有兴趣,那么一起来看吧~~

坑一:vuex公共状态管理与vuex状态渲染机制的坑

  • 先来看一段代码,理论上,count1(第一个p标签的值)和count2(第二个p标签的值)显示的数字应该是相同的,但实际上,只有count2能保持实时刷新
  • 这里分析下原因:
    1. count1是用组件内声明的变量去接收vuex内的公共状态,页面首次渲染可以成功得到state中的状态,但后续就不再去state中拿数据了。这里在data中接收公共状态的数据,相当于是个一次性赋值的操作
    2. count2直接在{{}}中调用state中的数据,当state中的数据发生改变,count2必然会发生改变,这样就实现了当前数据与公共状态中的数据保持一致
    // store.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    import axios from 'axios'
    Vue.use(Vuex);
    const store = new Vuex.Store({
        state: {
            count: 10,
            secCount: 10086
        },
        getters: {
            // getter 返回一个函数 add(num)
            add: (state, getter) => (num) => {
                return state.count + num;
            },
            // getter 返回一个数值 app
            app: (state, getter) => {
                return state.count - 10;
            }
        },
        mutations: {
            plus(state, num) {
                state.count += num;
            },
            minus(state, num) {
                state.count -= num;
            },
            printf(state, res) {
                console.log('调用mutions中的printf方法打印: ', res);
            }
        },
        actions: {
            actionA({ dispatch, commit }) {
                setTimeout(function () {
                    console.log('延时1s打印actionA')
                }, 1000);
            },
            actionB({ dispatch, commit }) {
                axios.get('../../static/data.json').then((res) => {
                    console.log('成功获取数据: ');
                    commit('printf',res.data);
                }).catch((err) => console.log('失败了!',err));
            }
        }
    });
    export default store;  

    // demo01.vue
    <template>
    <div class="hello">
        <p>count1: {{ count }}</p>
        <p>count2: {{ $store.state.count }}</p>
        <button @click="plus">点击+2</button>
    </div>
    </template>
    <script>
    export default {
        data () {
            return {
            count: this.$store.state.count
            }
        },
        methods:{
            plus(){
                console.log('点击+2');
                this.$store.commit('plus', 2);
            }
        }
    }
    </script>
  • 点击几次增加数字的效果如下
    渲染机制的问题
  • 这里提醒朋友们注意不要因为这个不起眼的细节导致你的vuex状态达不到效果
  • 那有朋友就问啦,没有办法使count1的形式也达到实时渲染公共状态的效果呢?毕竟项目大的话,每次都要写$store.state.XXX是一件很麻烦的事情,也很难看!!!这里我告诉你,有办法, 向下看!!!

先补一个ES6的新东西,以免新人看下面的坑不明所以

  • 我们使用Vue开发项目一般都是用webpack快速构建,好处是可以无后顾之忧的使用ES6和ES7的新语法,新语法有很多,这里我只说两个,便于大家看后边的东西,其余的在后边的学习工作中在慢慢以博客形式更新
  • 第一个:ES6的promise异步处理。下面的实例中,用到了一个轻量级的ajax库axios,它请求完成返回的就是一个promise对象,promise对象只有三种状态(异步执行中pending,执行成功resovled,执行失败rejected),并且在同一时刻只可能处于其中的一种状态。在axios中,执行成功会调用then()方法,失败会被catch()方法捕捉
    axios.get('../../static/data.json')     // pending 执行中的promise
    .then((res) => {                        // resovled 执行成功
        console.log('成功获取数据: ');
        commit('printf',res.data);
    })
    .catch((err) => console.log('失败了!',err));   // rejected 执行失败
  • 第二个:扩展运算符...对象或数组。作用是不使用遍历、contact方法等,就可以快捷的将数组(或对象)混入到另一个或多个数组(或对象中),例如
    let ar1 = [1, 3], ar2 = ['a', 'b'];
    let arr = ['abc', ...ar1, ...ar2, 456];
    console.log(arr);   // ['abc', 1, 3, 'a', 'b', 456]

    let obj1 = {a: 1, b: 3}, obj2 = {aaa: 345};
    let obj = {...obj1, qqq: 'aqa', ...obj2, aaa: 0};
    console.log(obj);    // {a: 1, b: 3, qqq: 'aqa', aaa: 0} 注意,这里的aaa的值被后面的覆盖为0

坑二:vuex的map辅助函数:mapState 、mapGetters、mapMutations、mapActions

  • 说起来呀,这个坑还真的是个磨人的老妖精呐。
  • 学习了一阵子ES6的我天真的以为这里的mapXXX跟ES6的对象的map方法一样,官方文档也写得太简单并且没有案例,折腾了老半天,一无所获-,-|
  • 我又继续往下看,打算看完还是不懂就放弃,反正不用这mapXXX也可以。但是,当我看到mapMutations和mapActions时,突然看到了这么一句,豁然开朗,这里的mapXXX不是简单的对象关系映射,而是用来映射对应的状态到vue组件中,作用主要是用来精简代码,将store中的状态映射到组建中,绑定到该组件的Vue对象上(this指针),例如下面的this.increment()相比this.$store.dispatch('increment')少了好多个字母是吧(发现新大陆,满满的成就感:)
    ...mapActions([
        'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`
        // `mapActions` 也支持载荷:
        'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
    ]),
  • 举一反三,我们自己来练习下这个mapXXX辅助函数
    // store.js 还是上面那个
    // demo1.vue 稍作改变
    <template>
    <div class="hello">
        <p>count1: {{ count }}</p>
        <p>count2: {{ $store.state.count }}</p>
        <button @click="plus">点击+2</button>
    </div>
    </template>
    <script>
    import {mapState} from 'vuex'
    export default {
        data () {
            return {}
        },

        computed:{
            ...mapState({
                count: 'count'
            })
        },

        methods:{
            plus(){
                console.log('点击+2');
                this.$store.commit('plus', 2);
            }
        }
    }
    </script>
  • 这里我先用一下mapState这个辅助函数,因为state是用来保存数据的,在组件中对应的就是computed计算属性了,因此我们在computed中映射一个count变量来接收state中的count变量,当然我们可以在这里给count1的变量任意命名,例如computed: mapState({ count1: 'count' }),,这样在用{{ count1 }}就可以接收到映射过来的state中的公共状态了,同时也会保持实时渲染。<p>count1: {{ count }}</p>现在的渲染效果与<p>count2: {{ $store.state.count }}</p>的渲染效果一样了,很神奇吧~~

  • 循序渐进,我们来看一下mapGetter的使用

    // demo1.vue 稍作改变
    <template>
    <div class="hello">
        <p>count1: {{ count }}</p>
        <p>count2: {{ $store.state.count }}</p>
        <p>app1: {{ app }}</p>
        <p>app2: {{ $store.getters.app }}</p>
        <button @click="plus">点击+2</button>
    </div>
    </template>
    <script>
    import {mapState} from 'vuex'
    export default {
        data () {
            return {}
        },

        computed:{
            ...mapState({
                count: 'count'
            }),
            ...mapGetters([
                'app'
            ])
        },

        methods:{
            plus(){
                console.log('点击+2');
                this.$store.commit('plus', 2);
            }
        }
    }
    </script>
  • 这样我们的getters就被映射到了demo1.vue组件中,就跟在组件中使用自己的状态(变量)一样方便了
  • 这里细心地同学就会发现,store.js中的getters有一个返回的是一个函数,不是数值能不能放到计算属性中呢?试一试吧
    <template>
    <div class="hello">
            <p>count1: {{ count }}</p>
            <p>count2: {{ $store.state.count }}</p>
            <p>app1: {{ app }}</p>
            <p>app2: {{ $store.getters.app }}</p>
            <p>add1: {{ add(num) }}</p>
            <p>add2: {{ $store.getters.add(num) }}</p>
        <button @click="plus">点击+2</button>
    </div>
    </template>

    <script>
    import {mapState,mapGetters} from 'vuex'
    export default {
        data () {
            return {
                num: 100
            }
        },
            computed:{
                ...mapState({
                    count: 'count'
                }),
                ...mapGetters([
                    'app',
                    'add'
                ])
            },
        created(){
            console.log('getters ', this.$store.getters.add(20));
        },
        methods:{
            plus(){
                console.log('点击+2');
                this.$store.commit('plus', 2);
            }
        }
    }
    </script>
  • 运行结果完全没问题,还可以传入参数
    运行mapGetters_02

  • mapMutations和mapActions的使用

     // demo1.vue
    <template>
        <div class="hello">
            <p>count1: {{ count }}</p>
            <p>count2: {{ $store.state.count }}</p>
            <p>app1: {{ app }}</p>
            <p>app2: {{ $store.getters.app }}</p>
            <p>add1: {{ add(num) }}</p>
            <p>add2: {{ $store.getters.add(num) }}</p>
            <button @click="plus">点击+2</button>
            <br><br>
            <button @click="getData">读取json</button>
        </div>
    </template>

    <script>
    import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
    export default {
        data () {
            return {
                num: 100
            }
        },
        computed:{
            ...mapState({
                count: 'count'
            }),
            ...mapGetters([
                'app',
                'add'
            ])
        },
        methods:{
            //   ...mapMutations([
            //       'plus'
            //   ]),
            ...mapMutations({
                newNamePlus: 'plus'
            }),
            ...mapActions([
                'actionA',
                'actionB'
            ]),
            plus(){
                console.log('点击+2');
                //   this.$store.commit('plus', 2);
                /**
                * 注意!!!严重错误
                * 
                * 因为我们的store.mutations中有个'plus'方法,上面注释掉的mapMutations映射过来的时候,
                * 方法名与本组件内的点击事件'plus()'方法同名,在下面直接调用(已被注释掉)会出现死循环,在成内存泄漏,继而使浏览器卡死的问题
                * 
                * 所以这里需要注意,使用上面为注释掉的mapMutations映射方法,
                * 如有同名函数方法在映射时一定要给方法重新命名
                */
                // this.plus(2);
                this.newNamePlus(2); // 实现效果与this.$store.commit('plus', 2);完全相同
            },
            getData(){
                this.actionB();// 作用等同与没有使用mapActions映射时的this.$store.dispatch('actionB');
            }
        }
    }
    </script>
  • 这里也有个大坑,有的时候 会出现命名重复的问题,不使用mapXXX方法时因为都在各自的文件中被调用,不会出现互相影响的问题,但是映射到同一个组件中时就可能出现上面的问题,造成程序出现内存泄漏的bug
  • 至于mapMutations和mapActions的映射一样,都是两种方法:直接映射的话,使用...mapActions(['方法1','方法2'])即可,如果映射过来时需要重新命名,那就需要用...mapActions({ newName1: '方法1', newName2: '方法2'})

最后,vuex在很小的项目中是显得有些冗余的,中型项目中,简单的vuex功能就可以很好的实现大多数功能了,大型项目中,必须严格的使用vuex的各部分,做到条理清晰,才能使团队开发高效的进行

萤石摄像头批量下载视频后FFmepg拼接 本文描述萤石摄像头,如何批量下载视频,然后把视频片段拼接为一个完整的视频,亲测有效。有问题,可以下面留言 阅读详情

相关推荐

软件工程:数据字典

数据字典

永远怀着至诚之心拥抱世界 4279

vuex的核心及图示

对应的内容存放在对应的文件中,和以前一样,在index.js中存放并导出store。如果 vue components 要执行好几种操作 一个方法是解决不了的(一个方法仅支持一种操作)他将回去调用action里面的其他方法 所以就用到了 dispatch。//借助mapState生成计算属性:sum、school、subject(对象写法)//借助mapState生成计算属性:sum、school、subject(数组写法)第一个是 执行的什么操作 执行的操作是action里面有的方法 加几 的 加。

m0_47298312的博客 2432

自抗扰控制ADRC原理解析及案例应用

ESO的设计通常基于系统动态方程的线性化或近似模型,其输出包括系统状态的估计值和总扰动的估计值。非线性状态误差反馈控制律(Nonlinear State Error Feedback,NLSEF)是ADRC的最后一个环节,负责根据ESO和TD提供的信息生成控制信号。ADRC的另一个重要发展方向是与其他控制策略的融合,如模糊控制、神经网络和自适应控制等,以进一步提高系统的鲁棒性和适应性。ADRC的参数主要包括扩张状态观测器(ESO)的参数和非线性状态误差反馈控制律(NLSEF)的参数。

LIUMAO99的博客 9286

Vuex 学习

什么是vuex: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。 原理图 安装使用vuex注意:vue2.0 对应 vuex3.0,vue3.0 对应vuex4.0,如果版本选中错误就会报错npm i vuex,如果用的是vue2.0 需要指定版本, npm i vuex@3 ,如果不指定版本,默认下载vuex4 vuex 的actions、mutations 、...

ykh12345678的博客 2万+

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2984

unity制作交互视频/互动视频

unity制作交互视频/互动视频 思路 1.先让unity播放视频 2. 视频播放结束后,视频暂停,按钮出现 3.按钮跳转下一个视频 视频播放 先创建UI-Raw Iamge 在Raw Iamge 挂载组件 Video Player 接着挂载视频播放的脚本 using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; publi...

weixin_45588911的博客 8428

store.dispatch和this.$store.dispatch的区别?

综上所述,store.dispatch和this.$store.dispatch实际上是指向同一个Vuex的dispatch方法,只是在调用时的语法稍有不同,前者在Vue实例外使用,后者在Vue组件内部使用。store.dispatch和this.$store.dispatch实际上是指向同一个Vuex的dispatch方法,只是在调用时的方式略有不同。this.$store.dispatch是在Vue组件中使用的方式,用于在组件内部触发Vuex的action。

xiaoxiaoovo的博客 1936

rockchip rk3566 android11 网口log报错: DMA engine initialization failed

问题描述:上电初始化前将网口插入,然后上电初始化网口能够正常使用,且能够找到PHY,ifconfig 查看能够有eth0 产生,网口正常使用且能够热插拔,但上电初始化时,不插入网口,就会报DMA engine initialization failed 错误,DMA 初始化的时候出错了。 分析:一般产生这个问题可以认为是GMAC 的工作时钟出问题了。先测量时钟引脚是否有时钟,时钟频率以及幅度等指标是否正常,主要确认以下几个方面: 1.IOMUX 出错,检查时钟脚寄存器值是否正确。 2.时钟方向以及配置

qq_48709036的博客 2万+

vuex的使用笔记

vuex的使用

weixin_45998693的博客 438

【DaVinci Configurator专题】-6-将UDS&OBD诊断数据库文件CDD和PDX导入到CFG

CDD和ODX是两种诊断数据库文件。机器可读的诊断数据库其实就是将传统的Excel调查表等信息编辑成CDD或ODX文件。CDD是Vector私有的一种诊断数据库格式;ODX是国际标准的诊断数据交互格式。CANdelaStudio编辑CDD文件,以及也可以导出ODX文件;ODX Studio用于编辑ODX文件,诊断数据库的编辑其实就是诊断需求的定义。 下面以PDX为例,将其导入到DaVinci Configurator。 目录 1 打开DaVinci Configurator,导入PDX文件 2 解.

「汽车电子助手」的博客 6756

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2187

Vue.js学习系列(四)

文章目录Vue.js学习系列(一):1~4章Vue.js学习系列(二):5~8章Vue.js学习系列(三):9~12章Vue.js学习系列(四)十三、Vue-router路由13.1 安装路由模块13.2 设计路由界面13.3 修改静态路由表13.4 引入路由模块并使用13.5 路由的实现13.5.1 链接路由的实现13.5.2 程序式路由的实现13.6 参数的传递十四、使用Axios发送请求14.1 什么是Axios(第三方组件)14.2 为什么要使用Axios14.3 Axios的使用14.3.1 安.

『地球是猿的』的博客 918

会员管理小程序实战开发04-用户登录及注册

上一节我们介绍了用户信息数据源的创建及网格布局的使用,本节的话我们讲解用户的登录及注册功能任何开发。 在我们前述章节里介绍的,不论是管理员表还是用户表,都涉及到一个问题就是openid,那这个openid如何获取呢?如果我直接把代码贴给你,就缺失了一个思考的过程。既然这个是微信提出的概念,那么必然就会有官方文档作为对应。程序开发的基本功就是要会看官方文档,很多初学的开发同学可能会对官方文档颇有诟病,觉得不够基础。怎么说呢,当你进入到开发岗之后,自学能力是必要的,还是要试着可以看懂官方文档才好。 登录接口解读

低代码布道师的博客 1568

vuex状态管理(二)超级详细使用教程(包含辅助函数map的使用),一看就会,一学就懂

)超级详细使用教程(包含辅助函数map的使用),一看就会,一学就懂

jieweiwujie的博客 471

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Vue—— vuex详解,彻底搞懂vuex

本文主要介绍vue中 Vuex 的相关知识点!!!!

Bonsoir777的博客 4万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Vue源码 Vuex(二)Vuex 初始化

Vue源码 Vuex(二)Vuex 初始化Vuex 初始化安装Store 实例化初始化模块安装模块初始化 `store._vm`总结Vue源码学习目录 学习内容和文章内容来自 黄轶老师 《Vue.js2.0 源码揭秘》、 《Vue.js 3.0 核心源码解析》 这里分析的源码是Runtime + Compiler 的 Vue.js 调试代码在:node_modules\vue\dist\vue.esm.js 里添加 vue版本:Vue.js 2.5.17-beta 你越是认真生活,你的生活就会越美好—

陈坚泓的博客 1878

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

vuex--学习笔记(二)在组件中如何获取vuex的state对象中的属性

前言:本文主要用于帮助笔者和新人理解vuex的使用,因个人能力有限,有什么建议可以留言一起探讨。这里,我首先想说明的是:一切都是语法糖,如果在实际应用中,你有什么地方不太了解,那只是对某个语法糖不太了解而已!因此,要多看,多学,最重要的,是多实践!自己多敲几遍代码,也就熟悉了。接上文:vuex--学习笔记(一)初识在上文中,我们实际上已经接触过一种在组件中获取vuex的state对象中属性的方法,...

gavincz的博客 8万+

vuex 数据在本地存储

前言: vuex可以进行全局的状态管理,但刷新后数据会消失,在有些情况下我们更希望当我们刷新页面后数据依然存在,即实现数据在本地永久存储。 实现方法有二,一是借助插件,二是手动利用HTML5的本地存储,显然前者比较方便。 方法一: 利用vuex-persistedstate插件(默认存储到localStorage) 步骤: (1)安装 npm install vuex-persis...

Jane_3210的博客 5359

从Vuex的角度学Redux

编写返回函数的 action creators,接收 dispatch 和 getState 作为参数,允许你在异步操作完成后分发 actions。用于从 Redux store 中选择(读取) state。通过 dispatch,你可以触发 actions(同步或异步)。mapState、mapGetters、mapActions、mapMutations函数。types.js: 定义 Redux action 类型的常量。actions.js: 定义action creators。

m0_48143251的博客 578

vuex的深入学习[基于vuex3]----篇(二)

store: store对象实例,new Vuex.store({…})生成的对象rootState: 根模块的state对象path: 当前模块所处的层级数组module: 模块对象hot。

m0_73280507的博客 952

vuex中遇到的坑,vuex数据改变,组件中页面不渲染

vuex数据改变,组件中页面不渲染 相信许多vuex新手都会遇到这样的问题: vuex数据更新后,插件中使用数据的地方没有更新 这样的代码 data() { return { tableData: this.$store.state.AdminInfo }; } 然后在 template 中使用 tableData <el-table :data="ta...

zzqz的博客 1万+

Vuex(二) —— 用Vuex完成购物车案例

把当前点击的商品存储到一个位置,将来在购物车列表组件中可以访问到,所以需要一个位置记录所有的购物车数据,这个数据在多个组件中可以共享,所以将这个数据放在。②和③都依赖购物车的数据,①中点击添加购物车,主要把数据传递给②和③,②和③之间的数据修改也互相依赖,如果没有。多添加商品的时候发现商品金额会出现很多位小数的问题,所以这里进行处理。统计的过程中需要添加条件,判断当前商品是否是选中状态。著作权归作者所有,转载或内容合作请联系作者。需要花时间精力在如何在组件中传值上。现在实现本地存储的功能。

qq_24428851的博客 1009

Vuex介绍

一、Vuex简介 二、了解vuex中的各个js文件的用途 三、利用vuex同步存值 四、利用vuex取值 五、Vuex的异步加载问题及后台调用问题

m0_53151031的博客 4427

VUEX

文章目录1.vue中各个组件之间传值2.了解vuex中的各个js文件的用途3. vuex使用步骤1.安装vuex2.在src目录下创建store模块,分别维护3 在store/index.js文件中新建vuex的store实例,并注册上面引入的各大模块4 在main.js中导入并使用store实例4.vuex取值:5.vuex存值6.调用ajax 1.vue中各个组件之间传值 1.父子组件 父组件...

尽力漂亮的博客 2154

浅谈vuex(二)——辅助函数

在Vuex中,mapState, mapGetters, mapMutations 和 mapActions 这些辅助函数就是语法糖。即辅助函数可以以更简洁、更容易读懂的方式来帮助我们使用vuex中的状态和方法。vuex辅助函数有四个mapState、mapMutations、 mapActions、 mapGetters.roles: [],},roles() {},},},这样用并没有问题,但是有聪明的彦祖就会想到:那我这个组件要用100个vuex中的状态怎么办?

y2250114617的博客 1308

一秒钟带你学废Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以想象为一个“前端数据库”(数据仓库), 让其在各个页面上实现数据的共享包括状态,并且可操作

彭于晏的博客 639
上一篇: nodejs做服务端多功能的简单实现
下一篇: ES6学习之路~~数据结构:set和map
EricLua
博客等级 码龄9年 34粉丝 33原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值