构建交互式Web应用程序:解析Vue.js中的关键概念和文件

前言

Vue是一种流行的JavaScript框架,也被称为Vue.js。它是由尤雨溪开发的一套用于构建用户界面的渐进式框架,可以帮助开发者更高效地构建交互式Web页面和单页应用程序。Vue具有简单易学、灵活、高效、可维护等特点,因此在前端开发中得到了广泛的应用。其核心库只关注视图层,易于与其他第三方库或现有项目整合。同时,Vue还拥有丰富的生态系统,如Vue Router、Vuex、Vue CLI等,可以帮助开发者更好地完成项目开发和管理。

Vue.js框架基础

模板语法

Vue.js使用基于HTML的模板语法,允许你将动态数据绑定到视图上。通过插值表达式(例如{{ message }})或指令(例如v-bind和v-on)来实现数据绑定和交互行为。

数据绑定

Vue.js提供了双向数据绑定的能力。这意味着当数据发生变化时,视图会自动更新;同时,用户在视图上的操作也会更新数据。你可以使用v-model指令来实现表单元素的双向数据绑定。

计算属性

计算属性允许你根据已有的数据属性计算出新的属性。与方法不同,计算属性具有缓存机制,只有在它依赖的属性发生变化时才会重新计算。这使得你可以编写简洁、高效的计算逻辑。

以下代码是计算属性的一个定义

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id ="demo">
        原本的message数据:{{message}}  <br>
        <!-- 通过split方法分割的数据:{{reverseMessage}}  -->
        <!-- 通过reverse方法颠倒的数据:{{reverseMessage}}  -->
        通过aplit方法分割的数据:{{reverseMessage}}          

    </div>

    <!-- 引入脚本 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <script>
        var app = new Vue({
            el:'#demo',
            data(){
                return {
                message:'hello'

                }
            },

            //计算属性
            computed:{
                // 定义一个计算后的数据
                // 颠倒-revetse
                reverseMessage(){
                    return this.message.split('').reverse().join('')
                }
            }

        })
    </script>
</body>
</html>
  1. 监听属性:你可以使用watch选项来监听一个或多个属性的变化,并在属性发生变化时执行相应的操作。这对于需要在特定条件下执行异步操作或较大计算量的情况非常有用。

以下代码展示为监听器的结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        //
        //
        //
        new Vue({
            el:'',
            data:{},
            methods:{

            },
        
        //
        watch:{
            //
            //
            要侦听的数据(newValue,oldValue){

            }
        }

    })
    </script>
</body>
</html>
  1. 条件渲染:Vue.js提供了一些指令来实现条件性地渲染DOM元素。例如,你可以使用v-if和v-show指令根据条件来显示或隐藏元素。

以下是条件渲染代码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <!-- <button @click="increaseMoney">月入三千多,每天笑哈哈</button> -->

    <div id="app">

        <button @click="increaseMoney">月入三千多,每天笑哈哈</button>

        <!-- 多分支使用v-if -->
        <p>根据班长有多少存款,觉得今天晚上吃什么</p>
        <p>{{ money }}</p>
        <div v-if="money > 10000">请全班同学吃海底捞</div>
        <div v-else-if="money > 5000">请全班同学吃麦门</div>
        <div v-else-if="money > 1000">请全班同学吃拌粉</div>
        <div v-else-if="money > 500">请全班同学甜蜜蜜</div>
        <div v-else>暴打班长一顿,并把班长的腰子噶了</div>

        <!-- 单分支使用v-if -->
        <div v-if="age >= 18">成年了,去网吧偷耳机</div>
        <div v-else>未成年,去公园捡垃圾</div>

        <button @click="demo">年龄增长</button>
        <div>{{ age }}</div>
    </div>

    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                money:888,
                age:14
            },
           
            methods: {
                 increaseMoney:function() {
                     this.money += 3000;
                 },

                demo(){
                    this.age ++
                }
            }
        })
    </script>
</body>
</html>
  1. 列表渲染:使用v-for指令,你可以方便地遍历数组或对象,并将其渲染为列表。同时,你还可以使用v-for的索引和当前项来处理列表中的每个元素。

下面展示如何使用v-for指令来渲染一个数组:

<ul>
  <li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>

上述代码中,v-for指令的语法为item in items,表示遍历items数组,并将每个数组元素渲染为一个<li>标签。:key属性用于对列表项进行唯一标识。

如果想要遍历一个对象的属性,则需要采用另一种语法:

<div v-for="(value, key) in obj" :key="key">{{ key }}: {{ value }}</div>

上述代码中,v-for指令的语法为(value, key) in obj,表示遍历obj对象,并将每个属性的键值对渲染为一个<div>标签。

除了常规的遍历外,v-for指令还支持多级遍历和嵌套遍历,使其更加灵活和强大。例如:

<ul>
  <li v-for="(group, index) in groups" :key="index">
    <h3>{{ group.name }}</h3>
    <ul>
      <li v-for="member in group.members" :key="member.id">{{ member.name }}</li>
    </ul>
  </li>
</ul>
  1. 组件化:Vue.js鼓励开发者将页面拆分成可复用的组件,以提高代码的可维护性和复用性。组件是独立的、自包含的模块,具有自己的视图和逻辑。你可以通过props属性传递数据给子组件,通过事件派发与$emit方法进行父子组件之间的通信。

以下代码展示如何定义和使用一个组件:

<!-- 定义组件 -->
<template id="my-component">
  <div>
    <h2>{{ title }}</h2>
    <p>{{ content }}</p>
  </div>
</template>

<script>
  Vue.component('my-component', {
    template: '#my-component',
    props: ['title', 'content']
  });
</script>

<!-- 使用组件 -->
<my-component title="Hello" content="World"></my-component>

  • 上述代码中,<template>标签包含了组件的模板部分,其中使用了Vue.js的模板语法来动态渲染数据。<script>标签中定义了一个名为my-component的全局组件,并通过props选项声明了组件接受的属性。

  • 在使用组件时,我们可以像使用普通HTML元素一样,将组件名称作为自定义标签使用,并通过属性传递给组件所需的数据。组件将会根据传递的数据动态渲染模板。

    除了全局组件之外,Vue.js还支持局部组件。局部组件只能在父组件内部使用,而不会被注册到全局命名空间。例如:

<!-- 父组件模板 -->
<template>
  <div>
    <my-component title="Hello" content="World"></my-component>
  </div>
</template>

<!-- 子组件模板 -->
<template id="my-component">
  <div>
    <h2>{{ title }}</h2>
    <p>{{ content }}</p>
  </div>
</template>

<!-- 父组件JavaScript -->
<script>
  export default {
    components: {
      'my-component': {
        template: '#my-component',
        props: ['title', 'content']
      }
    }
  };
</script>
  1. 生命周期钩子:Vue.js组件具有一系列的生命周期钩子函数,允许你在不同阶段执行自定义的操作。常见的生命周期钩子有created、mounted、updated和destroyed等。这些钩子函数提供了对组件不同状态的控制和干预。

下面是一些常用的生命周期钩子函数及其用法示例:

new Vue({
  el: '#app',
  data() {
    return {
      message: 'Hello Vue.js!'
    };
  },
  beforeCreate() {
    console.log('beforeCreate hook');
    // 在实例初始化之前调用,在此阶段无法访问到data和methods等选项
  },
  created() {
    console.log('created hook');
    // 在实例创建完成后被调用,此时已经可以访问到data和methods等选项
  },
  beforeMount() {
    console.log('beforeMount hook');
    // 在挂载之前被调用,此时模板已经编译完成,但尚未挂载到页面上
  },
  mounted() {
    console.log('mounted hook');
    // 在挂载完成后被调用,此时组件已经被渲染到页面上
  },
  beforeUpdate() {
    console.log('beforeUpdate hook');
    // 在数据更新之前被调用,但DOM尚未重新渲染
  },
  updated() {
    console.log('updated hook');
    // 在数据更新且DOM重新渲染完成后被调用
  },
  beforeDestroy() {
    console.log('beforeDestroy hook');
    // 在实例销毁之前被调用,此时组件仍然可用
  },
  destroyed() {
    console.log('destroyed hook');
    // 在实例销毁后被调用,组件已经不再可用
  },
  methods: {
    updateMessage() {
      this.message = 'Updated message';
    },
    destroyComponent() {
      this.$destroy();
    }
  }
});

  1. 上述代码中,我们创建了一个Vue实例,并定义了各个生命周期钩子函数。在控制台输出中,你可以看到每个钩子函数在对应的阶段被自动调用。

    这些钩子函数的执行顺序是:

  2. beforeCreate
  3. created
  4. beforeMount
  5. mounted
  6. beforeUpdate
  7. updated
  8. beforeDestroy
  9. destroyed

通过定义这些钩子函数,我们可以在合适的时机执行相关的代码逻辑,例如在mounted钩子函数中进行初始化操作,在beforeDestroy钩子函数中进行资源清理等。

请注意,beforeCreatecreated钩子函数是在组件实例化过程中的最早阶段被调用的,而beforeMountmounted钩子函数是在DOM渲染阶段被调用的。

  1. Vue Router:Vue Router是官方提供的路由管理器,用于实现单页应用程序的导航和路由功能。它允许你定义路由映射,通过URL来匹配并加载相应的组件。

下面是一个简单的使用Vue Router的示例:

  • 安装Vue Router

在项目目录下,通过npm或yarn安装Vue Router:

npm install vue-router
  • 创建路由配置文件

在项目根目录下创建一个名为router.js的文件,该文件用于定义路由相关的配置。

import Vue from 'vue';
import VueRouter from 'vue-router';

// 导入需要路由的组件
import Home from './components/Home.vue';
import About from './components/About.vue';

// 安装VueRouter插件
Vue.use(VueRouter);

// 创建路由实例
const router = new VueRouter({
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      component: About
    }
  ]
});

export default router;
  • 在根组件中使用路由

在根组件中,引入路由配置文件,并将其配置为Vue实例的选项之一。

<template>
  <div>
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
    <router-view></router-view>
  </div>
</template>

<script>
import router from './router';

export default {
  router
};
</script>
  • 在上述代码中,<router-link>标签用于创建带有链接的导航,to属性指定了链接的目标路径。<router-view>标签用于显示当前路由对应的组件。

  1. 定义路由组件

在示例中,我们导入了HomeAbout两个组件,并在路由配置中分别设置了对应的路径和名称。

<!-- Home.vue -->
<template>
  <div>
    <h2>Home</h2>
    <p>Welcome to the home page.</p>
  </div>
</template>

<!-- About.vue -->
<template>
  <div>
    <h2>About</h2>
    <p>This is the about page.</p>
  </div>
</template>
  • 运行Vue应用
  • 完成以上步骤后,使用npm run serve启动Vue应用,你将能够通过点击导航链接在不同的页面之间进行切换。

    这只是一个简单的Vue Router使用示例,Vue Router还提供了更多高级功能,如动态路由、嵌套路由、路由守卫等。你可以查阅Vue Router的官方文档以获取更多详细的信息和示例。

    希望以上信息对你有所帮助。如果你还有其他问题,请随时提问。

  1. Vuex:Vuex是Vue.js的状态管理库,用于在大型应用程序中管理共享的状态。它提供了一个全局的状态容器,允许不同组件之间共享和修改状态。

单文件组件

Vue.js中用于组件化开发的一种方式。它将一个组件的模板、样式和逻辑都封装在一个独立的文件中,使得组件的开发和维护更加方便和可读。

在单文件组件中,通常包含以下三个部分:

  1. 模板(Template):模板部分定义了组件的结构和布局,使用HTML和Vue的模板语法编写。你可以在模板中使用插值表达式、指令、计算属性等来实现动态数据绑定和逻辑控制。

  2. 脚本(Script):脚本部分是组件的逻辑和行为的定义,使用JavaScript或TypeScript编写。你可以在脚本中定义组件的属性、方法、生命周期钩子等。脚本部分通常会导出一个Vue组件对象。

  3. 样式(Style):样式部分用于定义组件的样式,可以使用CSS、Sass、Less等预处理器编写。你可以将样式直接写在单文件组件中,也可以通过引入外部样式文件的方式进行样式的定义。

使用单文件组件的主要好处如下:

  1. 组件化开发:单文件组件使得组件开发更加模块化和可复用。每个组件都有自己的模板、脚本和样式,使得代码结构更清晰,并且可以更好地组织和管理组件。

  2. 分离关注点:将模板、脚本和样式分开放置,使得每个部分的代码更加专注于自己的任务。这样可以提高代码的可读性和可维护性,并且方便多人协作开发。

  3. 预处理器支持:单文件组件支持使用预处理器编写样式(如Sass、Less)和脚本(如TypeScript)。这使得开发者可以使用更强大和灵活的工具来编写组件的样式和逻辑。

  4. 更好的开发体验:使用单文件组件可以借助Vue的开发工具和插件提供更好的开发体验。例如,编辑器扩展可以提供语法高亮、代码补全和错误检查等功能,使得开发过程更加高效。

总的来说,单文件组件是一种有效的组件化开发方式,它可以提高代码的可读性、可维护性和可复用性,同时也提供了更好的开发体验和工具支持。在Vue.js中,单文件组件已成为开发Vue应用程序的常见做法。

Vue CLI(Vue Command Line Interface)

是用于创建和管理基于Vue.js的项目的官方工具。它提供了一组命令,使开发者能够快速搭建项目结构、配置开发环境,并使用各种插件和工具来增强开发体验。

使用Vue CLI可以帮助开发者更高效地创建和管理Vue.js项目。下面是Vue CLI的一些主要功能和特点:

  1. 快速原型开发:Vue CLI提供了内置的webpack构建工具和现代前端开发工具链,可以快速搭建Vue.js项目的开发环境,并支持热重载、代码分割等功能,方便开发者进行快速原型开发。

  2. 逐步式增量升级:Vue CLI支持逐步引入更多功能和工具。开发者可以根据项目需要选择性地添加插件和扩展功能,而不必一次性加载所有功能,从而使得项目的体积更小,加载速度更快。

  3. 插件系统:Vue CLI提供了丰富的插件系统,开发者可以通过添加插件来扩展项目的功能。这些插件可以是官方提供的,也可以是第三方开源社区提供的插件,如路由管理、状态管理、单元测试等。

  4. 配置化:Vue CLI通过一套基于配置文件的方式,使得开发者可以灵活地配置项目的构建、打包和部署等环境。开发者可以根据自己的需求,进行个性化的配置,从而满足不同项目的需求。

Vue.js的路由器和状态管理

Vue.js框架中非常重要的两个概念,它们分别用于管理前端应用程序的路由和状态。

Vue Router是Vue.js官方提供的路由器库,用于在前端应用程序中实现客户端路由。它使得我们可以轻松地实现页面之间的导航,同时支持路由参数、嵌套路由、路由守卫等复杂功能。使用Vue Router,我们可以将前端应用程序划分为多个页面,并根据不同的URL地址动态地加载页面内容,从而提高用户体验。

Vuex是Vue.js官方提供的状态管理库,用于管理应用程序中的状态。它提供了一种全局管理应用程序状态的方式,可以在不同组件之间共享状态,并且可以通过定义mutations、actions、getters等模块化的方式来管理状态的读取和修改。Vuex的主要目标是使得状态管理更加集中化、可维护性更高,并且在多个组件之间共享状态变得更加容易。

使用Vue Router和Vuex可以实现一个完整的前端应用程序,其中Vue Router用于管理路由,控制页面的跳转和显示;Vuex用于管理状态,控制数据的读取和修改。在实际开发中,Vue Router和Vuex通常会配合使用,以实现更加复杂和高效的前端应用程序。

Vue.js生命周期

指在Vue实例创建、挂载、更新和销毁过程中,Vue提供的一系列钩子函数,用于在不同的阶段执行相应的代码逻辑。Vue的生命周期可以分为以下几个阶段:

  1. 创建阶段(Initialization):

    • beforeCreate:在Vue实例初始化之后,但是在数据观测和事件配置之前被调用。此时,实例还没有初始化完成,data、computed、methods等选项都不能访问。
    • created:在Vue实例创建完成后被调用。此时,实例已经完成了数据观测、属性和方法的运算,但是DOM元素还未生成,无法访问挂载的元素。
  2. 挂载阶段(Mounting):

    • beforeMount:在Vue实例挂载到DOM元素之前被调用。此时,模板编译已经完成,但是尚未将模板渲染成真实的DOM。
    • mounted:在Vue实例挂载到DOM元素后被调用。此时,实例的视图已经渲染到页面上,可以操作DOM元素。
  3. 更新阶段(Updating):

    • beforeUpdate:在响应式数据更新,重新渲染之前被调用。此时,虚拟DOM已经重新渲染,但是尚未将新的变化应用到真实DOM上。
    • updated:在重新渲染和更新完DOM之后被调用。此时,组件已经更新完毕,可以进行一些DOM操作。
  4. 销毁阶段(Destroying):

    • beforeDestroy:在Vue实例销毁之前被调用。此时,实例仍然完全可用,可以进行一些清理工作,如清除定时器、解绑事件等。
    • destroyed:在Vue实例销毁之后被调用。此时,Vue实例以及其所有的指令和监听器都已经解绑,不再可用。

在每个生命周期钩子函数中,我们可以执行一些相关的逻辑操作,例如初始化数据、发送网络请求、订阅事件、操作DOM元素等。通过合理使用生命周期钩子函数,我们可以在不同的阶段对应用程序进行精确的控制和操作。

需要注意的是,Vue 3与Vue 2的生命周期钩子函数有所不同。Vue 3中引入了新的生命周期钩子函数,具体的变化和使用方式请参考Vue官方文档。

Vue插件和扩展

在Vue.js中,插件和扩展是用来扩展Vue的功能和提供可复用的功能组件的一种方式。插件和扩展可以帮助我们实现一些通用的功能或者抽象出可复用的代码逻辑,从而提高开发效率和代码的可维护性。

Vue插件是一个对象,它可以包含一些全局方法、指令、混入等,通过Vue.use()方法来安装插件。插件将功能封装起来,使得我们可以在Vue应用程序的任何地方使用这些功能。常见的Vue插件有Vuex、Vue Router、Vue-i18n等。

下面是一个简单的示例,展示了如何创建一个Vue插件:

// 自定义插件
const MyPlugin = {
  install(Vue) {
    // 添加全局方法
    Vue.myGlobalMethod = function() {
      console.log('This is a global method');
    };
    
    // 添加全局指令
    Vue.directive('my-directive', {
      bind(el, binding) {
        el.innerText = binding.value;
      }
    });
    
    // 添加全局混入
    Vue.mixin({
      created() {
        console.log('This is a global mixin');
      }
    });
  }
};

// 安装插件
Vue.use(MyPlugin);

// 使用全局方法
Vue.myGlobalMethod();

// 在模板中使用全局指令
<template>
  <div v-my-directive="'Hello World'"></div>
</template>

Vue扩展是通过扩展Vue的原型来添加新的方法或属性,从而实现对Vue的功能扩展。扩展使得我们可以在组件中方便地调用这些扩展方法或访问扩展属性。常见的Vue扩展有自定义Vue实例方法、自定义指令等。

下面是一个简单的示例,展示了如何创建一个Vue扩展:

// 自定义扩展
const MyExtension = {
  install(Vue) {
    // 扩展Vue实例方法
    Vue.prototype.$myMethod = function() {
      console.log('This is a custom method');
    };
    
    // 扩展全局指令
    Vue.directive('my-directive', {
      bind(el, binding) {
        el.innerText = binding.value;
      }
    });
  }
};

// 使用扩展
new Vue({
  directives: {
    'my-directive': MyExtension
  },
  created() {
    this.$myMethod();
  }
});

通过使用插件和扩展,我们可以将一些通用的功能封装起来,从而在不同的Vue应用程序中灵活地复用和扩展这些功能。同时,通过合理地设计和使用插件和扩展,可以提高代码的可维护性和可读性,使得开发过程更加高效和便捷。

Vue的构建配置

主要是通过Vue CLI来完成的。Vue CLI是一个官方提供的脚手架工具,用于快速构建基于Vue的项目。它集成了许多开发所需的工具和配置,包括构建系统、开发服务器、热重载、代码打包等。

以下是一些常见的Vue构建配置选项:

  1. publicPath:指定应用程序在生产环境中的部署路径。默认为根路径 /,可以根据需要修改为其他路径。

  2. outputDir:指定打包后的文件输出目录。默认为 dist 目录。

  3. assetsDir:指定静态资源(如图片、样式文件等)的目录。默认为根目录。

  4. productionSourceMap:是否生成生产环境的 source map 文件。默认为 true,可以将其设置为 false 来减小文件体积。

  5. configureWebpack:自定义 webpack 配置。你可以通过这个选项来扩展或修改默认的 webpack 配置。

  6. chainWebpack:通过链式调用的方式对 webpack 配置进行更细粒度的修改。这个选项提供了一种更直观、灵活的方式来修改webpack配置。

  7. devServer:开发服务器的配置选项。你可以配置代理、端口号、是否自动打开浏览器等。

以上只是一些常见的配置选项,实际上还有更多选项可以根据具体需求进行配置。

在使用Vue CLI创建项目后,你可以在项目根目录中找到一个名为 vue.config.js 的文件。在这个文件中,你可以添加或修改构建配置。如果该文件不存在,你可以手动创建它。

以下是一个简单的示例,展示了如何使用 vue.config.js 文件来修改构建配置:

// vue.config.js

module.exports = {
  publicPath: process.env.NODE_ENV === 'production' ? '/my-app/' : '/',
  outputDir: 'dist',
  assetsDir: 'static',
  productionSourceMap: false,
  devServer: {
    port: 8080,
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true
      }
    }
  }
};

通过修改这个文件,你可以自定义Vue项目的构建配置。

Vue生态系统

是指围绕Vue.js框架形成的一系列工具、库和插件。这些工具和库提供了丰富的功能和解决方案,帮助开发者更高效地开发Vue应用程序。

以下是Vue生态系统中一些重要的组成部分:

  1. Vue Router:Vue官方提供的路由管理器。它允许你在Vue应用程序中实现页面之间的导航和路由。

  2. Vuex:Vue官方提供的状态管理库。它用于管理Vue应用程序中的全局状态,并提供了一种响应式的机制来进行状态更新和同步。

  3. Vue CLI:Vue官方提供的脚手架工具。它用于快速搭建Vue项目,提供了项目创建、配置、开发服务器、构建等一系列功能。

  4. Vue Devtools:一个浏览器扩展,用于调试Vue应用程序。它提供了一个强大的开发工具,可以检查组件层次结构、状态变化、性能优化等。

  5. Vuetify、Element UI、Ant Design Vue等UI组件库:这些组件库提供了丰富的UI组件和样式,可以帮助开发者更快速地构建漂亮的用户界面。

  6. Axios、vue-resource等网络请求库:这些库提供了方便的方式来进行HTTP请求,与后端API进行通信。

  7. Nuxt.js:一个基于Vue的通用应用框架,用于构建服务器渲染的Vue应用程序。它提供了许多有用的功能,如路由、数据预取、静态生成等。

除了上述组件之外,还有大量的第三方库和插件可供选择,用于增强Vue应用程序的功能和效果。Vue生态系统非常活跃,不断涌现出新的工具和库,以满足不同开发需求。

总之,Vue生态系统提供了丰富而完善的工具和库,使得开发者能够更便捷地构建出高质量的Vue应用程序。无论是开发单页面应用、多页面应用、移动应用还是桌面应用,Vue生态系统都能提供相应的解决方案和支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快习中学乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值