前端开发:(六)Vue快速入门

9 篇文章 0 订阅

1. 介绍Vue.js

1.1 什么是Vue.js

Vue.js是一款流行的前端JavaScript框架,用于构建交互式的用户界面。它的核心目标是通过简单的API和响应式数据绑定,使构建用户界面变得更加简单和快速。

1.2 Vue.js 的主要特点和优势

Vue.js具有以下主要特点和优势:

  • 简洁易用:Vue.js提供了简单、直观的API,使得开发者能够快速上手并构建复杂的Web应用。
  • 响应式数据绑定:Vue.js采用了响应式数据绑定机制,当数据发生变化时,视图会自动更新,简化了数据和视图的同步操作。
  • 组件化开发:Vue.js支持组件化开发,将界面拆分成独立、可复用的组件,使得代码更加清晰和易于维护。
  • 虚拟DOM:Vue.js使用虚拟DOM技术来提高页面渲染性能,只对发生变化的部分进行更新,减少了页面重绘和重新排版的开销。
  • 生态丰富:Vue.js拥有庞大的社区和丰富的生态系统,提供了许多插件、工具和解决方案,满足不同场景和需求的开发。
1.3 Vue.js 的发展历史和生态系统

Vue.js由尤雨溪于2014年首次发布,经过多年的发展,已成为当今前端开发中最受欢迎的框架之一。Vue.js生态系统包括Vue Router用于管理路由、Vuex用于状态管理、Vue CLI用于快速搭建项目等,还有许多第三方插件和库可供选择,为开发者提供了丰富的工具和资源。Vue.js的社区活跃,持续不断地推出新的版本和功能,使得Vue.js成为了现代Web开发中不可或缺的一部分。

2. 准备工作

2.1 安装Node.js和npm

在开始使用Vue.js之前,需要先安装Node.js和npm(Node Package Manager)。Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,用于在服务器端运行JavaScript代码,而npm是Node.js的包管理工具,用于安装和管理JavaScript包和依赖项。

2.2 创建第一个Vue.js 应用

通过Vue CLI(命令行界面)工具可以快速创建和管理Vue.js项目。使用Vue CLI可以自动配置开发环境,并提供了许多实用的命令和工具,方便开发者进行开发、调试和部署。

2.3 Vue CLI 的安装和使用

Vue CLI可以通过npm全局安装,安装命令如下:

npm install -g @vue/cli

安装完成后,就可以使用vue create命令来创建新的Vue.js项目:

vue create my-project

创建完成后,进入项目目录并启动开发服务器:

cd my-project
npm run serve

以上就是准备工作的基本步骤,通过安装Node.js和npm,并使用Vue CLI创建和启动一个新的Vue.js项目,就可以开始开发Vue.js应用了。

3. Vue 实例

3.1 创建Vue实例

在Vue.js中,通过创建Vue实例来管理应用的数据和行为。Vue实例是Vue.js的核心,它包含了响应式数据、模板和方法等。

// 示例:创建Vue实例
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello, Vue!'
    }
});

上面的示例中,我们创建了一个Vue实例,并将其挂载到HTML文档中的id为app的元素上。Vue实例的data选项用于声明数据,这里声明了一个名为message的属性,初始值为’Hello, Vue!'。

3.2 Vue 数据和方法

Vue实例中的数据和方法都可以通过datamethods选项进行声明。

// 示例:Vue数据和方法
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello, Vue!'
    },
    methods: {
        reverseMessage: function() {
            this.message = this.message.split('').reverse().join('');
        }
    }
});

在上面的示例中,我们声明了一个名为reverseMessage的方法,当调用该方法时,会将message的内容反转后重新赋值给message属性。

3.3 模板语法和指令

Vue.js提供了一套简洁灵活的模板语法,用于将Vue实例中的数据绑定到DOM元素,并实现动态渲染和交互。

<!-- 示例:模板语法和指令 -->
<div id="app">
    <p>{{ message }}</p>
    <button v-on:click="reverseMessage">Reverse Message</button>
</div>

在模板中,我们可以使用{{ }}语法来插值显示Vue实例中的数据,也可以使用v-on指令来监听DOM事件并执行Vue实例中的方法。

通过上述示例,我们可以看到Vue.js的基本用法,包括创建Vue实例、声明数据和方法、以及使用模板语法和指令来实现数据绑定和事件处理。Vue.js的简洁易用性使得前端开发变得更加高效和愉快。

4. 数据绑定

4.1 插值和表达式

Vue.js支持使用插值和表达式将数据绑定到DOM元素上,从而实现动态渲染。

<!-- 示例:插值和表达式 -->
<div id="app">
    <p>{{ message }}</p>
    <p>{{ message.toUpperCase() }}</p>
    <p>{{ number + 1 }}</p>
</div>

在上面的示例中,{{ }}插值语法用于显示Vue实例中的数据,并支持在插值中使用JavaScript表达式。

4.2 双向数据绑定

Vue.js还支持双向数据绑定,通过v-model指令可以将表单元素的值和Vue实例中的数据进行双向绑定。

<!-- 示例:双向数据绑定 -->
<div id="app">
    <input type="text" v-model="message">
    <p>{{ message }}</p>
</div>

在上面的示例中,输入框的值会与Vue实例中的message属性进行双向绑定,当输入框的值发生变化时,message属性的值也会随之更新。

4.3 计算属性和侦听器

Vue.js提供了计算属性和侦听器来实现对数据的监听和计算,并在数据发生变化时执行相应的操作。

<!-- 示例:计算属性和侦听器 -->
<div id="app">
    <p>Original message: {{ originalMessage }}</p>
    <p>Computed reversed message: {{ reversedMessage }}</p>
</div>
// Vue实例中的计算属性和侦听器
var app = new Vue({
    el: '#app',
    data: {
        originalMessage: 'Hello, Vue!'
    },
    computed: {
        reversedMessage: function() {
            return this.originalMessage.split('').reverse().join('');
        }
    },
    watch: {
        originalMessage: function(newValue, oldValue) {
            console.log('Message changed from', oldValue, 'to', newValue);
        }
    }
});

在上面的示例中,我们定义了一个计算属性reversedMessage,它会根据originalMessage属性的值动态计算出一个反转后的消息。同时,我们还定义了一个侦听器watch,用于监听originalMessage属性的变化,并在变化时执行相应的操作。

通过上述示例,我们可以看到Vue.js强大的数据绑定能力,包括插值和表达式、双向数据绑定、计算属性和侦听器等,可以帮助开发者轻松处理复杂的数据逻辑和界面交互。

5. 条件和循环

5.1 条件渲染(v-if、v-else、v-show)

Vue.js提供了v-ifv-elsev-show等指令来实现条件渲染,根据表达式的真假来动态地显示或隐藏DOM元素。

<!-- 示例:条件渲染 -->
<div id="app">
    <p v-if="isDisplayed">This paragraph is displayed.</p>
    <p v-else>This paragraph is hidden.</p>

    <div v-show="isVisible">
        <p>This div is visible.</p>
    </div>
</div>

在上面的示例中,根据Vue实例中的isDisplayedisVisible属性的值,决定是否渲染对应的DOM元素。

5.2 列表渲染(v-for)

Vue.js提供了v-for指令来实现列表的渲染,可以遍历数组或对象,并动态地生成DOM元素。

<!-- 示例:列表渲染 -->
<div id="app">
    <ul>
        <li v-for="item in items" :key="item.id">{{ item.name }}</li>
    </ul>
</div>

在上面的示例中,根据Vue实例中的items数组,遍历每个元素并动态生成对应的li元素。

5.3 列表过滤和排序

除了列表渲染外,Vue.js还支持列表的过滤和排序,可以根据特定条件对列表进行筛选和排序。

<!-- 示例:列表过滤和排序 -->
<div id="app">
    <ul>
        <li v-for="item in filteredItems" :key="item.id">{{ item.name }}</li>
    </ul>
</div>
// Vue实例中的过滤和排序
var app = new Vue({
    el: '#app',
    data: {
        items: [
            { id: 1, name: 'Item 1', category: 'A' },
            { id: 2, name: 'Item 2', category: 'B' },
            { id: 3, name: 'Item 3', category: 'A' },
            // more items...
        ]
    },
    computed: {
        filteredItems: function() {
            return this.items.filter(item => item.category === 'A');
        }
    }
});

在上面的示例中,我们根据category属性对列表进行了过滤,只显示分类为’A’的项。Vue.js的列表渲染、过滤和排序功能使得处理复杂的数据列表变得简单和高效。

6. 事件处理

6.1 事件监听和处理方法

Vue.js允许通过v-on指令来监听DOM事件,并在触发事件时执行相应的处理方法。

<!-- 示例:事件监听和处理方法 -->
<div id="app">
    <button v-on:click="handleClick">Click me</button>
</div>
// Vue实例中的事件处理方法
var app = new Vue({
    el: '#app',
    methods: {
        handleClick: function() {
            alert('Button clicked!');
        }
    }
});

在上面的示例中,我们通过v-on:click指令来监听按钮的点击事件,并在点击时调用handleClick方法。

6.2 事件修饰符

Vue.js还提供了事件修饰符来对事件进行更精确的控制,如.stop用于阻止事件冒泡、.prevent用于阻止默认事件、.once用于只触发一次等。

<!-- 示例:事件修饰符 -->
<div id="app">
    <a href="#" v-on:click.stop.prevent="handleClick">Click me</a>
</div>

在上面的示例中,我们使用了.stop.prevent修饰符来同时阻止事件的冒泡和默认行为。

6.3 自定义事件和事件总线

Vue.js允许组件之间通过自定义事件来进行通信,父组件可以通过$emit方法触发事件,子组件则可以通过$on方法监听事件。

// 示例:自定义事件和事件总线
// 创建一个简单的事件总线对象
var eventBus = new Vue();

// 在父组件中触发事件
eventBus.$emit('event-name', eventData);

// 在子组件中监听事件
eventBus.$on('event-name', function(eventData) {
    // 处理事件
});

通过上述示例,我们可以看到Vue.js提供了强大的事件处理功能,包括事件监听、事件修饰符、自定义事件和事件总线等,使得组件之间的通信变得简单而灵活。

7. 表单处理

7.1 双向数据绑定和表单输入

Vue.js提供了v-model指令来实现表单元素和Vue实例数据的双向绑定,使得表单输入和Vue实例数据的同步变得简单和高效。

<!-- 示例:双向数据绑定和表单输入 -->
<div id="app">
    <input type="text" v-model="message">
    <p>{{ message }}</p>
</div>

在上面的示例中,输入框的值会与Vue实例中的message属性进行双向绑定,当输入框的值发生变化时,message属性的值也会随之更新。

7.2 表单验证和提交

Vue.js可以通过自定义验证规则和事件处理方法来实现表单验证和提交。

<!-- 示例:表单验证和提交 -->
<div id="app">
    <form @submit.prevent="handleSubmit">
        <input type="text" v-model="username" placeholder="Username">
        <input type="password" v-model="password" placeholder="Password">
        <button type="submit">Login</button>
    </form>
</div>
// Vue实例中的表单验证和提交
var app = new Vue({
    el: '#app',
    data: {
        username: '',
        password: ''
    },
    methods: {
        handleSubmit: function() {
            // 进行表单验证
            if (this.username === 'admin' && this.password === 'password') {
                alert('Login successful!');
            } else {
                alert('Invalid username or password!');
            }
        }
    }
});

在上面的示例中,我们通过@submit.prevent指令来监听表单提交事件,并在提交时调用handleSubmit方法进行表单验证。

7.3 自定义表单控件

Vue.js还允许开发者自定义表单控件,以满足特定的业务需求。

<!-- 示例:自定义表单控件 -->
<div id="app">
    <custom-input v-model="message"></custom-input>
</div>
// 自定义表单控件组件
Vue.component('custom-input', {
    template: `
        <input
            type="text"
            :value="value"
            @input="$emit('input', $event.target.value)"
        >
    `,
    props: ['value']
});

var app = new Vue({
    el: '#app',
    data: {
        message: ''
    }
});

在上面的示例中,我们创建了一个自定义表单控件组件custom-input,并在父组件中使用v-model指令将其与Vue实例中的message属性进行双向绑定。

通过以上示例,我们可以看到Vue.js提供了强大的表单处理功能,包括双向数据绑定、表单验证和提交、以及自定义表单控件等,使得表单操作变得更加简单和灵活。

8. 组件化开发

8.1 组件的基本概念和语法

在Vue.js中,组件是可复用的Vue实例,它可以封装一段特定功能的HTML代码、CSS样式和JavaScript逻辑,使得代码更加模块化和可维护。

<!-- 示例:组件的基本概念和语法 -->
<div id="app">
    <my-component></my-component>
</div>
// 定义一个全局组件
Vue.component('my-component', {
    template: '<div>This is a custom component.</div>'
});

var app = new Vue({
    el: '#app'
});

在上面的示例中,我们定义了一个名为my-component的全局组件,并在HTML中使用了该组件。组件的模板内容可以使用template选项进行定义,这里我们简单地输出了一段文本。

8.2 父子组件通信

Vue.js中的组件通信分为父子组件通信和兄弟组件通信。父子组件通信是指父组件向子组件传递数据或调用子组件的方法,可以通过props和事件来实现。

<!-- 示例:父子组件通信 -->
<div id="app">
    <parent-component></parent-component>
</div>
// 子组件
Vue.component('child-component', {
    template: '<div>{{ message }}</div>',
    props: ['message']
});

// 父组件
Vue.component('parent-component', {
    template: '<child-component :message="parentMessage"></child-component>',
    data: function() {
        return {
            parentMessage: 'Message from parent component'
        };
    }
});

var app = new Vue({
    el: '#app'
});

在上面的示例中,父组件通过props将数据传递给子组件,子组件接收并渲染该数据。

8.3 插槽(slot)的使用

Vue.js中的插槽(slot)是一种机制,允许父组件向子组件传递内容,子组件可以在预留位置插入内容。

<!-- 示例:插槽的使用 -->
<div id="app">
    <parent-component>
        <p>Content from parent component.</p>
    </parent-component>
</div>
// 父组件
Vue.component('parent-component', {
    template: '<div><slot></slot></div>'
});

var app = new Vue({
    el: '#app'
});

在上面的示例中,父组件中使用了一个插槽,子组件的内容将会被插入到这个插槽中。

通过以上示例,我们可以看到Vue.js中组件化开发的基本概念和语法,包括组件的定义、父子组件通信和插槽的使用,这些功能使得Vue.js应用的组织和管理变得更加灵活和高效。

9. 路由与导航

9.1 Vue Router 的基本配置和使用

Vue Router 是 Vue.js 官方的路由管理器,可以实现单页面应用的路由功能,通过定义路由和组件的映射关系,实现页面间的切换和导航。

// 示例:Vue Router 的基本配置和使用
// 安装 Vue Router:npm install vue-router
// 引入 Vue Router 库
import Vue from 'vue';
import VueRouter from 'vue-router';

// 使用 Vue Router
Vue.use(VueRouter);

// 定义路由组件
const Home = { template: '<div>Home</div>' };
const About = { template: '<div>About</div>' };

// 定义路由配置
const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
];

// 创建路由实例
const router = new VueRouter({
  routes
});

// 创建和挂载根实例
new Vue({
  router
}).$mount('#app');

在上面的示例中,我们首先安装并引入 Vue Router 库,然后定义了两个简单的路由组件 HomeAbout,并且配置了两个路由规则,分别映射到不同的组件。最后创建了一个路由实例并挂载到根 Vue 实例上。

9.2 路由参数和动态路由

Vue Router 支持路由参数和动态路由,可以通过占位符来表示不同的路由路径,并将参数传递给组件。

// 示例:路由参数和动态路由
const User = { 
  template: '<div>User {{ $route.params.id }}</div>'
};

const routes = [
  { path: '/user/:id', component: User }
];

在上面的示例中,我们定义了一个动态路由 /user/:id:id 表示一个参数,当访问 /user/123 时,会渲染 User 组件,并且 $route.params.id 的值为 123

9.3 嵌套路由和命名路由

Vue Router 还支持嵌套路由和命名路由,可以将路由配置进行嵌套组织,并为路由取一个名称,方便程序中动态跳转。

// 示例:嵌套路由和命名路由
const User = { 
  template: `
    <div class="user">
      <router-view></router-view>
    </div>
  `
};

const UserProfile = { template: '<div>Profile</div>' };
const UserPosts = { template: '<div>Posts</div>' };

const routes = [
  { 
    path: '/user/:id', 
    component: User,
    children: [
      { path: 'profile', component: UserProfile },
      { path: 'posts', component: UserPosts }
    ]
  }
];

在上面的示例中,我们定义了一个嵌套路由 /user/:id,其子路由为 profileposts,当访问 /user/123/profile 时,会渲染 User 组件,并在其内部的 <router-view> 中渲染 UserProfile 组件。

通过以上示例,我们可以看到 Vue Router 提供了丰富的路由功能,包括基本路由配置、路由参数和动态路由、嵌套路由和命名路由等,能够满足复杂单页面应用的路由需求。

10. 状态管理

10.1 Vuex 的介绍和安装

Vuex 是 Vue.js 官方提供的状态管理库,用于集中管理 Vue.js 应用中的所有组件的状态。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态的一致性。

# 安装 Vuex:npm install vuex
// 示例:Vuex 的基本配置和使用
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

// 创建一个 Vuex store 实例
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  }
});

export default store;

在上面的示例中,我们首先安装并引入了 Vuex 库,然后创建了一个 Vuex store 实例,定义了应用的状态(state)和变更状态的方法(mutations)。

10.2 Vuex 的基本使用和核心概念

Vuex 的核心概念包括 state、mutations、actions、getters 等。

  • state:应用的状态存储,类似于 Vue 实例中的 data 属性。
  • mutations:用于变更状态的方法,每个 mutation 都有一个字符串类型的事件类型(type)和一个回调函数(handler)。
  • actions:类似于 mutations,但不直接修改状态,而是提交 mutations 来修改状态。可以包含任意异步操作。
  • getters:类似于组件的计算属性,用于从 store 中派生出一些状态,可以对 store 中的状态进行筛选、计算等。
// 示例:Vuex 的基本使用和核心概念
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    incrementAsync(context) {
      setTimeout(() => {
        context.commit('increment');
      }, 1000);
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2;
    }
  }
});

export default store;

在上面的示例中,我们定义了一个简单的 Vuex store,包括 state、mutations、actions 和 getters,并且分别实现了计数器的递增、异步递增和计算当前计数器值的两倍。

11. HTTP请求

11.1 Vue.js 中的 HTTP 请求

在 Vue.js 中进行 HTTP 请求通常使用第三方库,比如 Axios 或者 Fetch API。这些库能够方便地在 Vue 组件中发送 HTTP 请求,并处理响应数据。

# 安装 Axios:npm install axios
// 示例:使用 Axios 发送 HTTP 请求
import axios from 'axios';

// 发送 GET 请求
axios.get('/api/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

// 发送 POST 请求
axios.post('/api/data', { key: 'value' })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

在上面的示例中,我们首先安装并引入了 Axios 库,然后使用 axios.getaxios.post 方法分别发送 GET 和 POST 请求,并处理响应数据。

11.2 使用 Axios 进行网络请求

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 的 HTTP 请求。它能够在浏览器中创建 XMLHTTPRequest 和 Node.js 中创建 http 请求。

// 示例:使用 Axios 进行网络请求
import axios from 'axios';

// 设置基础请求 URL
axios.defaults.baseURL = 'https://localhost.example.com';

// 发送 GET 请求
axios.get('/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

在上面的示例中,我们设置了 Axios 的基础请求 URL,并使用 axios.get 方法发送 GET 请求,并处理响应数据。

11.3 处理HTTP响应和错误

在发送 HTTP 请求后,我们需要处理响应数据和可能出现的错误。Axios 提供了 .then.catch 方法来处理成功和失败的情况。

// 示例:处理 HTTP 响应和错误
axios.get('/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

在上面的示例中,.then 方法用于处理成功的情况,.catch 方法用于处理失败的情况,比如网络错误或服务器错误。

12. 生命周期与动画

12.1 Vue 生命周期的基本概念

Vue.js 提供了生命周期系统,可以在元素插入、更新或移除时自动应用生命周期效果。通过使用内置的生命周期类名和 CSS 生命周期,我们可以实现各种动画效果。

<!-- 示例:Vue 过渡的基本概念 -->
<div id="app">
  <button @click="toggle">Toggle</button>
  <transition name="fade">
    <p v-if="show">Hello, Vue!</p>
  </transition>
</div>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
// Vue 实例中的数据和方法
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    toggle() {
      this.show = !this.show;
    }
  }
});

在上面的示例中,当点击按钮时,生命周期元素的显示状态会发生变化,根据 v-if 的值来决定是否应用效果。

12.2 生命周期类名和钩子函数

Vue 过渡系统提供了一些内置的类名和钩子函数,用于实现更丰富的动画效果。

<!-- 示例:生命周期类名和钩子函数 -->
<transition
  name="custom-classes-transition"
  enter-active-class="animated fadeIn"
  leave-active-class="animated fadeOut"
  @before-enter="beforeEnter"
  @enter="enter"
  @after-enter="afterEnter"
  @before-leave="beforeLeave"
  @leave="leave"
  @after-leave="afterLeave"
>
</transition>
// Vue 实例中的方法
methods: {
  beforeEnter(el) {
    // 在进入之前设置初始状态
  },
  enter(el, done) {
    // 进入中
    // 过渡完成时调用 done()
  },
  afterEnter(el) {
    // 进入结束后的回调
  },
  beforeLeave(el) {
    // 在离开之前设置初始状态
  },
  leave(el, done) {
    // 离开中
    // 过渡完成时调用 done()
  },
  afterLeave(el) {
    // 离开结束后的回调
  }
}

在上面的示例中,我们定义了过渡的自定义类名和钩子函数,分别对应过渡的不同阶段,可以在这些钩子函数中实现相应的动画逻辑。

12.3 使用动画库实现更复杂的动画效果

除了使用 CSS 生命周期外,Vue 还支持使用 JavaScript 动画库(如 Velocity.js 或 GSAP)来实现更复杂的动画效果。

<!-- 示例:使用动画库实现动画效果 -->
<transition
  appear
  enter-active-class="animated bounceIn"
  leave-active-class="animated bounceOut"
>
  <!-- 这里是要过渡的元素 -->
</transition>

在上面的示例中,我们使用了动画库提供的类名来实现进入和离开时的动画效果,比如使用了 animated 类和 bounceIn 类来实现弹跳效果。

通过以上示例,我们可以看到 Vue 生命周期系统提供了丰富的功能和灵活的配置方式,能够轻松实现各种动画效果,从简单的淡入淡出到复杂的动画效果。

  • 50
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星光闪闪k

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

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

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

打赏作者

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

抵扣说明:

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

余额充值