vue3 学习(一)

vuejs从入门到精通(一)笔记,学习:尚硅谷Vue2.0+Vue3.0全套教程 初始vue,vue是什么?谁开发的?vue的特点是什么?怎么使用? 阅读详情

vue3学习(一)

setup

setup函数是一个新的组件选项,座位再组件内使用Composition API 的入口点

  • 调节时机
    • 创建组件实例,然后初始化props 紧接着就调用setup函数。从生命周期钩子视角来看,他会再beforeCreate钩子之前被调用
  • 模板中使用
    • 如果setup返回一个对象,则对象的属性将会被合并到组件模板的渲染上下文
<template>
  <div>{{ count }} {{ object.foo }}</div>
</template>

<script>
  import { ref, reactive } from 'vue'

  export default {
    setup() {
      const count = ref(0)
      const object = reactive({ foo: 'bar' })

      // 暴露给模板【暴露一个对象,模板中可以直接拿对象内的属性】
      // 此处ref会在模板中自动解开,无需写.value
      return {
        count,
        object,
      }
    },
  }
</script>
  • 渲染函数 / JSX 中使用
    • setup也可以返回一个函数,函数中也能使用当前setup 函数作用域中的响应式数据
import { h, ref, reactive } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const object = reactive({ foo: 'bar' })

    return () => h('div', [count.value, object.foo])
  },
}
  • 参数
    • 该函数接收props作为其第一个参数
export default {
  props: {
    name: String,
  },
  setup(props) {
    console.log(props.name)
  },
}

注意 props 对象是响应式的,watchEffect 或 watch 会观察和响应 props 的更新:

export default {
  props: {
    name: String,
  },
  setup(props) {
    watchEffect(() => {
      console.log(`name is: ` + props.name)
    })
  },
}

// 注意不要解构 props对象,那样会使其失去响应性  setup return的对象也不要解构,会导致失去响应式
export default {
  props: {
    name: String,
  },
  setup({ name }) {
    watchEffect(() => {
      console.log(`name is: ` + name) // 不再响应式!
    })
  },
}

在开发过程中,props 对象对用户空间代码是不可变的(用户代码尝试修改 props 时会触发警告)。

第二个参数提供了一个上下文对象,从原来 2.x 中 this 选择性地暴露了一些 property。

const MyComponent = {
  setup(props, context) {
    context.attrs
    context.slots
    context.emit
  },
}

attrs 和 slots 都是内部组件实例上对应项的代理,可以确保在更新后仍然是最新值。所以可以解构,无需担心后面访问到过期的值:

const MyComponent = {
  setup(props, { attrs }) {
    // 一个可能之后回调用的签名
    function onClick() {
      console.log(attrs.foo) // 一定是最新的引用,没有丢失响应性
    }
  },
}

出于一些原因将 props 作为第一个参数,而不是包含在上下文中:

  • 组件使用 props 的场景更多,有时候甚至只使用 props

  • 将 props 独立出来作为第一个参数,可以让 TypeScript 对 props 单独做类型推导,不会和上下文中的其他属性相混淆。这也使得 setup 、 render 和其他使用了 TSX 的函数式组件的签名保持一致。

注意:this 在 setup() 中不可用。由于 setup() 在解析 2.x 选项前被调用,setup() 中的 this 将与 2.x 选项中的 this 完全不同。同时在 setup() 和 2.x 选项中使用 this 时将造成混乱。在 setup() 中避免这种情况的另一个原因是:这对于初学者来说,混淆这两种情况的 this 是非常常见的错误

setup() {
  function onClick() {
    this // 这里 `this` 与你期望的不一样!
  }
}

类型定义【TODO】

interface Data {
  [key: string]: unknown
}

interface SetupContext {
  attrs: Data
  slots: Slots
  emit: (event: string, ...args: unknown[]) => void
}

function setup(props: Data, context: SetupContext): Data

响应式系统 API

reactive

接收一个普通对象然后返回该对象的响应式代理。等同于2.x的Vue.observable()

const obj = reactive({ count: 0 })

响应式转换是深层的:会影响对象内部所有嵌套的属性。基于ES2015的Proxy实现,返回的代理对象不等于原始对象。建议仅使用代理对象从而避免依赖原始对象

类型定义

function reactive<T extends object>(raw: T):T
ref

接受一个参数值并返回一个响应式且可以改变的ref对象。ref对象拥有一个指向内部值的单一属性 .value

const count = ref(0)
console.log(count.value) //0

count.value++
console,log(count.value) //1

如果传入ref的是一个对象,将调用reactive方法进行深层响应转换

模板中访问

当ref作为渲染上下文的属性返回(即在setup() 返回的对象中) 并在模板使用时,他会自动解套,无需在模板内额外书写.value

<template>
  <div>{{ count }}</div>
</template>

<script>
  export default {
    setup() {
      return {
        count: ref(0),
      }
    },
  }
</script>

作为响应式对象的属性访问

当 ref 作为 reactive 对象的 property 被访问或修改时,也将自动解套 value 值,其行为类似普通属性

const count = ref(0)
const state = reactive({
  count,
})

console.log(state.count) // 0

state.count = 1
console.log(count.value) // 1

注意如果将一个新的 ref 分配给现有的 ref, 将替换旧的 ref

const otherCount = ref(2)

state.count = otherCount
console.log(state.count) // 2
console.log(count.value) // 1

注意当嵌套在 reactive Object 中时,ref 才会解套。从 Array 或者 Map 等原生集合类中访问 ref 时,不会自动解套:

const arr = reactive([ref(0)])
// 这里需要 .value
console.log(arr[0].value)

const map = reactive(new Map([['foo', ref(0)]]))
// 这里需要 .value
console.log(map.get('foo').value)

类型定义

interface Ref<T> {
  value: T
}

function ref<T>(value: T): Ref<T>

有时我们可能需要为 ref 做一个较为复杂的类型标注。我们可以通过在调用 ref 时传递泛型参数来覆盖默认推导

const foo = ref<string | number>('foo') // foo 的类型: Ref<string | number>

foo.value = 123 // 能够通过
computed

传入一个 getter 函数,返回一个默认不可手动修改的 ref 对象。

const count = ref(1)
const plusOne = computed(() => count.value + 1)

console.log(plusOne.value) // 2

plusOne.value++ // 错误!

或者传入一个拥有 get 和 set 函数的对象,创建一个可手动修改的计算状态

const count = ref(1)
const plusOne = computed({
  get: () => count.value + 1,
  set: (val) => {
    count.value = val - 1
  },
})

plusOne.value = 1
console.log(count.value) // 0

类型定义

// 只读的
function computed<T>(getter: () => T): Readonly<Ref<Readonly<T>>>

// 可更改的
function computed<T>(options: {
  get: () => T
  set: (value: T) => void
}): Ref<T>

readonly

传入一个对象(响应式或普通)或 ref,返回一个原始对象的只读代理。一个只读的代理是“深层的”,对象内部任何嵌套的属性也都是只读的。

const original = reactive({ count: 0 })

const copy = readonly(original)

watchEffect(() => {
  // 依赖追踪
  console.log(copy.count)
})

// original 上的修改会触发 copy 上的侦听
original.count++

// 无法修改 copy 并会被警告
copy.count++ // warning!

watchEffect

立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数。

const count = ref(0)

watchEffect(() => console.log(count.value))
// -> 打印出 0

setTimeout(() => {
  count.value++
  // -> 打印出 1
}, 100)
停止侦听

当 watchEffect 在组件的 setup() 函数或生命周期钩子被调用时, 侦听器会被链接到该组件的生命周期,并在组件卸载时自动停止。

在一些情况下,也可以显式调用返回值以停止侦听

const stop = watchEffect(() => {
  /* ... */
})

// 之后
stop()
清除副作用

有时副作用函数会执行一些异步的副作用, 这些响应需要在其失效时清除(即完成之前状态已改变了)。所以侦听副作用传入的函数可以接收一个 onInvalidate 函数作入参, 用来注册清理失效时的回调。当以下情况发生时,这个失效回调会被触发:

副作用即将重新执行时

侦听器被停止 (如果在 setup() 或 生命周期钩子函数中使用了 watchEffect, 则在卸载组件时)

watchEffect((onInvalidate) => {
  const token = performAsyncOperation(id.value)
  onInvalidate(() => {
    // id 改变时 或 停止侦听时
    // 取消之前的异步操作
    token.cancel()
  })
})

我们之所以是通过传入一个函数去注册失效回调,而不是从回调返回它(如 React useEffect 中的方式),是因为返回值对于异步错误处理很重要

在执行数据请求时,副作用函数往往是一个异步函数:

const data = ref(null)
watchEffect(async () => {
  data.value = await fetchData(props.id)
})

我们知道异步函数都会隐式地返回一个 Promise,但是清理函数必须要在 Promise 被 resolve 之前被注册。另外,Vue 依赖这个返回的 Promise 来自动处理 Promise 链上的潜在错误。

副作用刷新时机

Vue 的响应式系统会缓存副作用函数,并异步地刷新它们,这样可以避免同一个 tick 中多个状态改变导致的不必要的重复调用。在核心的具体实现中, 组件的更新函数也是一个被侦听的副作用。当一个用户定义的副作用函数进入队列时, 会在所有的组件更新后执行:

<template>
  <div>{{ count }}</div>
</template>

<script>
  export default {
    setup() {
      const count = ref(0)

      watchEffect(() => {
        console.log(count.value)
      })

      return {
        count,
      }
    },
  }
    
// 在这个例子中:

// count 会在初始运行时同步打印出来
// 更改 count 时,将在组件更新后执行副作用。
// 请注意,初始化运行是在组件 mounted 之前执行的。因此,如果你希望在编写副作用函数时访问 DOM(或模板 ref),请在 onMounted 钩子中进行:
</script>

onMounted(() => {
  watchEffect(() => {
    // 在这里可以访问到 DOM 或者 template refs
  })
})

如果副作用需要同步或在组件更新之前重新运行,我们可以传递一个拥有 flush 属性的对象作为选项(默认为 'post'):

// 同步运行
watchEffect(
  () => {
    /* ... */
  },
  {
    flush: 'sync',
  }
)

// 组件更新前执行
watchEffect(
  () => {
    /* ... */
  },
  {
    flush: 'pre',
  }
)
侦听器调试

onTrack 和 onTrigger 选项可用于调试一个侦听器的行为。

  • 当一个 reactive 对象属性或一个 ref 作为依赖被追踪时,将调用 onTrack
  • 依赖项变更导致副作用被触发时,将调用 onTrigger

这两个回调都将接收到一个包含有关所依赖项信息的调试器事件。建议在以下回调中编写 debugger 语句来检查依赖关系

watchEffect(
  () => {
    /* 副作用的内容 */
  },
  {
    onTrigger(e) {
      debugger
    },
  }
)

onTrack 和 onTrigger 仅在开发模式下生效。

watch

watch API 完全等效于 2.x this.$watch (以及 watch 中相应的选项)。watch 需要侦听特定的数据源,并在回调函数中执行副作用。默认情况是懒执行的,也就是说仅在侦听的源变更时才执行回调。

  • 对比 watchEffect,watch 允许我们:

    • 懒执行副作用;
    • 更明确哪些状态的改变会触发侦听器重新运行副作用;
    • 访问侦听状态变化前后的值。
  • 侦听单个数据源

    侦听器的数据源可以是一个拥有返回值的 getter 函数,也可以是 ref:

    // 侦听一个 getter
    const state = reactive({ count: 0 })
    watch(
      () => state.count,
      (count, prevCount) => {
        /* ... */
      }
    )
    
    // 直接侦听一个 ref
    const count = ref(0)
    watch(count, (count, prevCount) => {
      /* ... */
    })
    
  • 侦听多个数据源

    watcher 也可以使用数组来同时侦听多个源:

    watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
      /* ... */
    })
    
  • 与 watchEffect 共享的行为

    watch 和 watchEffect 在停止侦听, 清除副作用 (相应地 onInvalidate 会作为回调的第三个参数传入),副作用刷新时机 和 侦听器调试 等方面行为一致.

  • 类型定义

    // 侦听单数据源
    function watch<T>(
      source: WatcherSource<T>,
      callback: (
        value: T,
        oldValue: T,
        onInvalidate: InvalidateCbRegistrator
      ) => void,
      options?: WatchOptions
    ): StopHandle
    
    // 侦听多数据源
    function watch<T extends WatcherSource<unknown>[]>(
      sources: T
      callback: (
        values: MapSources<T>,
        oldValues: MapSources<T>,
        onInvalidate: InvalidateCbRegistrator
      ) => void,
      options? : WatchOptions
    ): StopHandle
    
    type WatcherSource<T> = Ref<T> | (() => T)
    
    type MapSources<T> = {
      [K in keyof T]: T[K] extends WatcherSource<infer V> ? V : never
    }
    
    // 共有的属性 请查看 `watchEffect` 的类型定义
    interface WatchOptions extends WatchEffectOptions {
      immediate?: boolean // default: false
      deep?: boolean
    }
    
Unity VR 零基础开发之 Pico4 MR 2、弹出弹窗后,点击Android选项,然后再点击Switch Platform按钮切换成安卓平台。3、切换完成后Android选项后面会显示unity图标。 阅读详情

相关推荐

从零构建NVENC编码器:一个游戏开发者的实战手册

本文详细介绍了如何从零构建NVENC编码器,特别针对游戏开发者提供实战指南。内容涵盖NVENC基础概念、DirectX纹理捕获、异步编码优化及高级特性配置,帮助开发者高效集成硬件编码技术到游戏引擎中,实现高性能游戏录制和直播功能。重点解析了NVIDIA专用编码芯片的优势与API使用技巧。

weixin_29292431的博客 365

vue3 + tsx 使用ref 获取子组件的值(antd vue)

使用tsx定义的父组件通过ref,获取子组件(tsx)里面的属性。

名人卷耶 2573

yakit 验证码识别 进行webfuzzer

在渗透测试的过程中,我们可能需要对管理员密码进行枚举,或者密码喷洒的时候,遇到验证码就很烦。有没有自动化识别验证码的办法呢?有的,兄弟,有的。验证码的识别率很低,captcha-killer-modified对算术验证码识别正确率非常低,还会识别成乱七八糟的结果,这就非常麻烦。因为你不知道到底是验证码不对,还是密码不对。这是 ddddocr 识别率的问题,如果师傅们找到准确度更高的工具,完全可以替换上去。

Arkmornings的博客 1664

在 tsx 中使用 react 的 ref 属性

函数组件 const myRef = React.useRef<HTMLDivElement>(null); return <div ref={myRef} />; 参考:1 参考:2

zahirah11的博客 2952

FPGA 核脉冲梯形成型 Verilog 实现:从 MATLAB 到 50MHz 采样率部署

本文详细解析了FPGA实现核脉冲梯形成型的完整流程,从MATLAB仿真到50MHz采样率的Verilog硬件部署。重点探讨了梯形成型算法对负指数信号的优化处理,包括定点数量化、流水线架构设计及资源优化技巧,为核辐射探测与高能物理实验提供高效解决方案。

weixin_30920513的博客 388

【干货】S7-PLCSIM Advanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

【干货】S7-PLCSIM Adavanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

handinvv的博客 5万+

vue3+tsx父组件调用子组件中的ref

vue3父组件调用子组件中的ref

m0_59394063的博客 2161

Google Earth Engine(GEE)—— 显示如何使用迁移的训练样本进行多年分类的脚本(sentinel-2影像为例)光谱差异()

HydroSHEDS 是一种地图产品,它以一致的格式为区域和全球范围的应用程序提供水文信息。它提供了一套不同比例的地理参考数据集(矢量和栅格),包括河流网络、流域边界、排水方向和流量累积。请注意,对于北纬 60 度以上的地区,HydroSHEDS 数据的质量明显较低,因为没有可用的基础 SRTM 高程数据,因此分辨率较低的 DEM(USGS 提供的 HYDRO1k)。该数据集基于 15 角秒(赤道约 500 米)分辨率栅格数据提供嵌套的分层分水岭多边形。光谱信息和之前不同的点:训练结果。

此星光明博客 966

vue3中tsx的基本语法使用

vue3中tsx的基本语法使用

温壁 3758

RK3568移植AP6256

本文主要是记录RK3568移植正基的AP6256的WIFIBT模块,感兴趣的朋友可以一起学习!!!提示:以下是本篇文章正文内容,下面案例可供参考。

qq_24093081的博客 3715

物理AI重构自动驾驶供应链 | 传统Tier1盈利模式崩塌,纯算法/软硬一体双路线落地对比,助力智驾软件商业化与全场景模型迭代

2026年是自动驾驶物理AI规模化落地元年,行业彻底告别传统感知-预测-规划-控制的模块化分层开发范式,迈入以世界模型、物理规则推演、端到端动作生成为核心的全新技术阶段。不同于传统AI仅完成图像识别、目标检测的浅层感知任务,物理AI能够深度理解道路交通中的动力学约束、路面摩擦、车辆博弈、行人运动规律等真实物理逻辑,实现对复杂路况的时序推演与自主决策,从底层重构自动驾驶技术架构。技术迭代同步引发产业链颠覆性变革,沿用数十年的传统自动驾驶Tier1商业模式全面崩塌。

getusushu的博客 286

Vue3中自定义Ref的使用

在Vue3中,ref()接受一个内部值,它返回的是一个ref对象,这个对象是响应式的,可以更改的,且只有一个指向其内部属性值的属性value。ref()将传入参数的值包装为一个带value属性的ref对象。

xllllll___的博客 5262

MAC-电脑中的user文件夹在哪?

MAC-电脑中的user文件夹在哪?

兴趣是最好的老师 1万+

vue3 一小时 学习day1

以下是学习内容(了解Vue.js的基本概念、安装Node.js和Vue CLI、创建第一个Vue3项目、了解Vue3的基本语法)的一些详细说明和步骤,帮助你更好地掌握这些基础知识。Vue.js是一个用于构建用户界面的渐进式框架。Vue.js需要Node.js环境来运行,Vue CLI(命令行工具)可以帮助快速创建和配置Vue项目。Vue3的核心是通过模板(Template)和数据绑定(Data Binding)来实现视图的更新。通过以上学习和实践,可以快速掌握Vue3的基本概念和语法,打下坚实的基础。

sinat_38992528的博客 865

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Vue3基础学习一

Vue3 基础学习一:包含简介、快速上手、创建一个应用、模板语法、响应式基础1、vue的核心功能声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。响应性:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。命令式是如果你想要什么,你要告诉“机器”,并且还要告诉“机器”,怎么做,开始、过程、结果都要有。声明式是告诉“机器”,你想要什么,不需要关心中间实现过程,我们只需要开始和结果。

qq_41897351的博客 697

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue3学习一:创建vue3项目

最近看到很多关于vue3的话题;所以最近就准备学习学习vue3;如果有什么不对的地方;希望大佬们多多指点;如果你也是刚学习的话;我们就一起学习努力哈;今天先创建以后项目看能否启动 如果没有安装vue/cli的话先安装 npm install -g @vue/cli 如果不知道是否安装或者说版本的话,可以用一下的命令查看 vue --version 如果以上都没问题的话;就可以根据以下命令进行创建项目了 vue create vue1(项目名称) 创建以后就会出现一下页面 以下配置跟vue2创建项目

weixin_50307964的博客 1559

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

vue3 学习记录一

目前版本3.2.25,官网地址 https://v3.cn.vuejs.org/guide 安装 CDN 包的形式导入 最新版本 开发使用 <script src="https://unpkg.com/vue@next"></script> npm 安装 # 最新稳定版 $ npm install vue@next # 单文件组件 编译插件 $ npm install -D @vue/compiler-sfc 命令行工具 (CLI) # 全局安装最新版本的 $ npm insta

go含羞草 704

Vue3学习(一)

ref创建的变量必须要用.value的方式去获取和修改数据reactive重新分配一个新对象,会失去响应式,要想不失去响应式,可以使用Object.assign(变量名,新对象) 的方式,给目标变量一个新的对象值。若需要一个基本类型的响应式数据,必须使用ref,若需要一个响应式对象,层级不深,ref和reactive都可以,若需要一个响应式对象,且层级较深,推荐使用reactive。

二狗mao的博客 1037

学习vue3(一)

2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600+次提交30+个RFC600+次PR99位贡献者什么是hook?—— 本质是一个函数,把setup函数中使用的Composition API进行了封装。类似于vue2.x中的mixin。自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂。

m0_66288747的博客 884

【vue3学习】vue3核心语法汇总 一

● 什么是 hook?—— 本质是一个函数,把 setup 函数中使用的 Composition API 进行了封装,类似于 vue2.x 中的 mixin。● 自定义 hook 的优势:复用代码, 让 setup 中的逻辑更清楚易懂。示例代码:})//向外部暴露数据// 方法try {// 发请求// 维护数据// 处理错误// 挂载钩子getDog()})//向外部暴露数据<template><h2>当前求和为:{{sum}}</h2>

aaaa_aaab的博客 1214

Vue3 学习 (一)

和 Vue2 相比 性能得到提升源码升级 使用 Proxy 代替 definedProperty 实现响应式重写虚拟 DOM 的实现和Tree-Shaking可以更好的支持 TypeScript新的特性:组合式 API:setup ref与reactive computed 与 watch新的内置组件新的声明周期钩子data 选项始终被声明为一个函数移除 keyCode 支持作为 v-on 的修饰符新的构建工具 和 webpack 等价官网:https://vitejs.cn。

qq_63342197的博客 1252

vue3学习一

vue三第一章学习

m0_57330841的博客 675

【vue3学习之路(一)】

参考视频:https://www.bilibili.com/video/BV1Za4y1r7KE?1.Vue3的setup和vue2传统的配置项(data,methods)可不可以同时写?若冲突,以谁为主?答:vue2的选项式语法可以和vue3的setup共存。data,methods可以和setup同时存在。data可以读取setup里的数据,setup不能读取data里数据-- <h2>姓名:{{a}}</h2>--> <!

m0_46123285的博客 542

Vue 2.0->3.0学习笔记(Vue 3 (一)- 创建Vue3.0工程)

【代码】Vue 2.0->3.0学习笔记(Vue 3 (一)- 创建Vue3.0工程)

PNPYY的博客 358

vue3学习一 setup

vue3中没有 data 等配置项, 并且它的引入方式也不是像vue2中的 import vue就可以了, 而是用到什么再引入什么, 其中 setup() 函数, 是最大的区别vue3中的 setup 有点像vue2中的 data , 但又不完全是setup 会在 生命周期created 之前执行一次,也就是说 setup 函数中是没有 this的, 因为vue还没有加载上去。

hjh15827475896的博客 913

vue3学习(一)

其实没啥好说的,直接上代码吧。index.html校验script执行权限。定义一个div,id为app。

zwrlj527的专栏 418
上一篇: 重学node(一)
下一篇: 结合公司项目对目前vue项目整体框架总结
大大黄、
博客等级 码龄8年 22粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值