本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文将展示如何使用Vue.js 2.x结合Element UI组件库开发一个音乐播放器应用程序。重点讲解了Vue.js的组件化特性、Element UI提供的UI元素,以及如何实现播放控制、歌曲搜索、响应式布局和数据处理等功能。项目中还将涉及使用HTML5 Audio API、处理网络请求以及提高用户交互体验的策略。
基于vue-element组件实现音乐播放器,vue 2.x开发的音乐APP

1. Vue.js 2.x基础和组件化特性

在现代前端开发领域,Vue.js 2.x已经成为开发者广泛采用的框架之一,其优雅的API设计和高效的组件化特性,使得构建用户界面变得简单、直观。组件化作为Vue的核心概念,不仅提升了代码的可维护性,也极大地增强了项目的模块化能力。

1.1 Vue.js 2.x核心概念简述

Vue.js 的核心之一是其数据驱动的声明式编程模式。开发者定义的数据状态变化会自动反映在视图上,这个过程是Vue的响应式系统自动完成的。当状态发生变化时,Vue会自动寻找依赖这些状态的DOM部分,并更新它们。

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
});

在上述代码中,Vue实例创建了一个简单的数据对象,并将其绑定到了页面中的 #app 元素。当 message 属性更改时,绑定到此数据的DOM元素也会自动更新。

1.2 组件化特性详解

组件是Vue.js中可复用的、独立的、封装好的代码块。它们拥有自己的模板、逻辑和样式,使得开发大型应用时能够将UI拆分成多个可复用的组件。这种模块化有助于提高代码的可维护性和可测试性。

组件的使用通常遵循以下模式:

<template>
  <div>
    <my-component></my-component>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  }
}
</script>

在这个例子中,我们导入了一个名为 MyComponent 的组件,并在父组件中声明了它。然后在模板中通过标签 <my-component> 使用这个组件,Vue将自动处理它的渲染。

1.3 Vue.js组件生命周期

Vue组件有自己的一套生命周期钩子,这些钩子允许在组件的不同生命周期阶段执行代码,例如初始化、挂载前后、更新前后以及销毁前。

export default {
  data() {
    return {
      // ...
    };
  },
  beforeCreate() {
    // 在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
  },
  created() {
    // 在实例创建完成后被立即调用。在这一步,实例已完成以下配置:数据观测 (data observer),属性和方法的运算,event/watcher 事件回调。
  },
  // 更多生命周期方法...
};

理解这些生命周期钩子对于开发中的组件状态管理和资源管理是非常关键的。通过在适当的生命周期阶段调用方法,可以实现更精细化的控制。

以上是第一章的内容概览,我们从Vue.js 2.x的基本概念开始,逐步深入到了组件化特性的核心细节。在接下来的章节中,我们将继续深入探讨,例如如何使用Element UI组件库来实现更加丰富的用户界面,以及如何利用Vue.js来构建音乐播放器等。

2. Element UI组件库的应用

2.1 Element UI组件库概述

2.1.1 Element UI组件库的安装与初始化

Element UI是一个基于Vue 2.0的桌面端组件库,为开发者提供了丰富的界面组件,从而极大地提高了开发效率和界面的一致性。在项目中引入Element UI之前,需要先安装它。推荐使用npm或者yarn等包管理器进行安装。

安装命令如下:

npm install element-ui --save
# 或者
yarn add element-ui

安装完毕后,在项目的入口文件中(通常是 main.js ),需要引入Element UI并使用它。

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

在上述代码中, import 语句首先从npm安装的包中引入 ElementUI 和它的样式表。 Vue.use() 方法则是用来应用Element UI插件,确保其在Vue应用中被注册和可用。

2.1.2 主要组件介绍与使用方法

Element UI提供了一系列开箱即用的组件,例如按钮(Button)、输入框(Input)、表格(Table)、分页(Pagination)等。这里以表格组件为例,展示如何在Vue项目中使用Element UI的组件。

<template>
  <el-table :data="tableData">
    <el-table-column prop="date" label="日期" width="180"></el-table-column>
    <el-table-column prop="name" label="姓名" width="180"></el-table-column>
    <el-table-column prop="address" label="地址"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        // 更多数据...
      }]
    };
  }
};
</script>

在这个简单的例子中, <el-table> 标签定义了一个表格,它通过 :data 属性绑定到一个名为 tableData 的数据源。表格的每一列通过 <el-table-column> 标签定义,并通过 prop 属性绑定到数据源的属性上。 label 属性定义了列的标题。通过这个例子,可以看到Element UI组件的易用性和直观性。

2.2 组件化开发实践

2.2.1 单文件组件的结构和特点

在Vue.js中,单文件组件(Single File Component)是推荐的组件结构形式,它将一个组件的结构(template)、样式(style)和脚本(script)封装在一个 .vue 文件中,这有助于项目模块化和组件复用。

一个典型的 .vue 文件结构如下所示:

<template>
  <div class="my-component">
    <p>这是一个示例组件</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  }
}
</script>

<style scoped>
.my-component p {
  color: red;
}
</style>

在这个例子中, <template> 标签内定义了组件的HTML结构; <script> 标签内定义了组件的JavaScript逻辑,其中包含了组件的数据、方法等; <style> 标签内定义了组件的CSS样式, scoped 属性确保样式只应用到当前组件。

2.2.2 组件的复用与封装

组件的复用与封装是提高开发效率和维护性的重要手段。一个封装良好的组件可以被重复使用在不同的地方,同时保持内部逻辑的独立和清晰。

例如,可以封装一个通用的弹出提示组件,将提示消息作为属性传递给它:

<!-- Popover.vue -->
<template>
  <div>
    <el-button @click="showPopover = true">点击弹出</el-button>
    <el-popover
      v-model="showPopover"
      title="标题"
      width="200"
    >
      <p>{{ content }}</p>
    </el-popover>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showPopover: false,
      content: '这是一条提示信息'
    };
  }
}
</script>

在使用这个组件的时候,只需要在父组件中引入并注册即可。

2.2.3 组件间通信机制

组件间通信是组件化开发中的核心概念,Vue.js 提供了几种不同的方法来实现组件间的数据传递和事件通知。

  • 父子组件通信
  • 父子组件的通信主要是通过 props events 实现。父组件可以通过 props 向子组件传递数据,子组件则通过 $emit 触发事件将数据传递给父组件。
<!-- 父组件 -->
<template>
  <my-component :parent-data="parentData" @child-event="handleChildEvent"></my-component>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  },
  data() {
    return {
      parentData: '这是父组件数据'
    };
  },
  methods: {
    handleChildEvent(data) {
      console.log('收到子组件数据:', data);
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <button @click="sendDataToParent">向父组件发送数据</button>
</template>

<script>
export default {
  props: ['parentData'],
  methods: {
    sendDataToParent() {
      this.$emit('child-event', this.parentData);
    }
  }
}
</script>
  • 非父子组件通信
  • 对于非父子组件之间的通信,可以利用一个共同的祖先组件来中转数据,或者使用Vue的事件总线(Event Bus)。
// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();

// 在组件A中发送事件
EventBus.$emit('my-event', '发送的数据');

// 在组件B中监听事件
EventBus.$on('my-event', (data) => {
  console.log('接收到的数据:', data);
});

通过以上方法,Vue.js提供了灵活的方式处理不同组件间的通信问题,使组件能够相互独立且协同工作,从而构建复杂而具有高度模块化的应用程序。

在上述内容中,我们详细探讨了Element UI组件库的安装、基本使用方法以及在实际开发中的应用。同时,我们还深入介绍了组件化开发的核心概念,包括单文件组件的结构和特点、组件的复用与封装以及组件间通信的机制。这些知识点构成了前端开发的基础,是提升开发效率和项目可维护性的关键。接下来,我们将继续深入了解Element UI在音乐播放器项目中的应用。

3. HTML5 Audio API在音乐播放器中的实现

3.1 HTML5 Audio API基础

3.1.1 Audio标签的基本用法

HTML5的 <audio> 标签为网页提供了嵌入音频内容的标准方法。与 <img> 标签类似, <audio> 标签也支持直接在HTML中嵌入内容,无需外部插件。开发者可以通过简单的标签属性来控制音频的播放、暂停、音量调节等基础操作。

下面是 <audio> 标签的简单用法示例:

<audio controls>
  <source src="path/to/your/audio/file.mp3" type="audio/mp3">
  您的浏览器不支持 Audio element。
</audio>

在这段代码中, controls 属性会向用户显示浏览器默认的音频控制界面。 <source> 标签的 src 属性指向了音频文件的位置, type 属性表示文件的MIME类型,以便浏览器快速识别音频格式。

3.1.2 Audio API的事件与方法

HTML5 Audio API提供了多种事件,这些事件可以用来监听音频的不同状态,例如播放、暂停、加载和结束等。此外,还有一系列的方法可以用来控制音频的播放行为,如 play() pause() load() 等。

下面是一个事件和方法应用的例子:

const audio = document.querySelector('audio');

// 监听加载结束事件
audio.addEventListener('canplaythrough', function() {
  console.log('音频已准备完毕,可以播放。');
});

// 监听播放事件
audio.addEventListener('play', function() {
  console.log('音频正在播放。');
});

// 监听暂停事件
audio.addEventListener('pause', function() {
  console.log('音频已暂停。');
});

// 播放音频
audio.play();

// 暂停音频
audio.pause();

在这段代码中,通过 querySelector 选取页面上的 <audio> 标签,并对其绑定了三个事件监听器。同时,通过调用 play pause 方法来控制音频的播放和暂停行为。

3.2 音乐播放器的音质控制

3.2.1 音量调节与音效处理

通过HTML5 Audio API,开发者可以实现音量的动态调节,以及对音频进行不同的音效处理。 volume 属性用于控制音频播放的音量大小,范围从0到1。

音量的调节可以通过以下方式实现:

// 设置音量为50%
audio.volume = 0.5;

// 增加音量10%
audio.volume += 0.1;

// 减少音量10%
audio.volume -= 0.1;

同时,音量的调节也可以通过用户交互来实现,比如使用滑动条(range)来动态调整:

<input type="range" id="volumeControl" min="0" max="1" step="0.01" value="0.5">
const volumeControl = document.getElementById('volumeControl');
volumeControl.addEventListener('input', function() {
  audio.volume = volumeControl.value;
});

音效处理往往需要更复杂的音频操作,比如使用Web Audio API来实现音频信号的处理。Web Audio API提供了更加强大的音频处理能力,例如混音、均衡器调整、回声和颤音等。

3.2.2 播放进度条的实现

播放进度条能够给用户带来更直观的播放状态信息。进度条的实现需要监听 timeupdate 事件,并根据音频当前播放时间与总时间的比值来更新进度条的位置。

// 监听时间更新事件
audio.addEventListener('timeupdate', function() {
  const currentTime = audio.currentTime; // 获取当前播放时间
  const duration = audio.duration; // 获取音频总时长
  // 更新进度条位置
  progressbar.value = (currentTime / duration) * 100;
});

其中 progressbar <input> 标签的一个实例,其类型为 range ,可以作为一个进度条显示在界面上:

<input type="range" id="progressbar" min="0" max="100" value="0">

通过这种方式,用户的播放进度可以实时反映在进度条上,从而提供更加丰富的交互体验。

接下来的章节内容将继续深入探讨网络请求、Vue响应式绑定和事件处理,以及音乐播放器界面布局、搜索功能的实现和用户体验的增强等方面的内容。通过这些技术细节的解析,我们能构建出功能丰富且高效的音乐播放器。

4. ```

第四章:网络请求和音乐资源加载

随着Web应用变得越来越复杂,网络请求和资源加载成为了前端开发中的关键部分。尤其是在音乐播放器这样的媒体应用中,能够快速且高效地加载音乐资源对于提供良好的用户体验至关重要。本章节将探讨前端网络请求机制和音乐资源的动态加载与管理。

4.1 前端网络请求机制

4.1.1 跨域问题的解决方案

由于浏览器的同源策略,前端应用在进行网络请求时往往会遇到跨域问题。跨域资源共享(CORS)是解决这一问题的主要策略。CORS允许服务器指示哪些域名可以访问资源,从而突破同源限制。

为了实现CORS,服务器端需要添加适当的HTTP头(如 Access-Control-Allow-Origin ),前端则通常通过在请求中添加 withCredentials 属性来处理凭证信息。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data', true);
xhr.withCredentials = true;
xhr.onreadystatechange = function() {
  if (this.readyState === 4 && this.status === 200) {
    // 处理响应数据
  }
};
xhr.send();

4.1.2 请求拦截与响应处理

在现代前端应用中,请求拦截和响应处理是网络请求不可或缺的一部分。这通常通过使用Axios或Fetch API等库实现。拦截器可以在请求发送前或响应返回后执行某些操作。

例如,使用Axios库时,可以设置请求拦截器来添加Token认证信息,以及设置响应拦截器来处理错误和转换数据格式。

axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    config.headers.Authorization = 'Bearer ' + token;
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

4.2 音乐资源的动态加载与管理

4.2.1 从服务器加载音乐列表

音乐播放器应用通常需要从服务器动态加载音乐列表。这可以通过发送GET请求到一个API端点实现。为了提高用户体验,这些请求应当尽量快速和可靠。

使用Fetch API可以实现异步加载音乐列表,同时可以结合Promise来处理响应数据。

fetch('https://api.music.com/tracks')
  .then(response => response.json())
  .then(tracks => {
    // 更新UI显示音乐列表
    updateMusicList(tracks);
  })
  .catch(error => {
    console.error('Error loading music tracks:', error);
  });

4.2.2 音乐文件的缓存策略

音乐文件往往体积较大,因此使用有效的缓存策略对于优化性能和减少带宽消耗至关重要。浏览器提供了多种方式来管理缓存,包括服务工作线程(Service Workers)和Cache API。

通过Service Workers,可以拦截网络请求并从缓存中提供资源,或者在后台更新缓存。Cache API允许我们在应用程序中存储和检索请求/响应对。

// 注册Service Worker
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker 注册成功');
    })
    .catch(error => {
      console.log('Service Worker 注册失败:', error);
    });
}

// 使用Cache API存储和检索资源
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        if (response) {
          // 从缓存中获取
          return response;
        }
        // 如果没有从缓存中获取到资源,则从网络获取
        return fetch(event.request);
      })
  );
});

通过这些策略,我们可以确保音乐播放器应用能够有效地加载和管理音乐资源,同时为用户提供流畅的体验。


# 5. Vue响应式数据绑定和事件处理

## 5.1 Vue响应式原理

### 5.1.1 响应式数据绑定的内部机制

Vue.js框架的核心特性之一是其响应式数据绑定系统。在Vue中,当一个组件的数据对象发生变化时,视图会自动更新以反映这些变化。这一机制的内部实现依赖于几个关键概念,包括依赖收集(Dependency Collection)、发布订阅模式(Publish-Subscribe Pattern)和虚拟DOM(Virtual DOM)。

在依赖收集阶段,Vue会遍历数据对象,并使用`Object.defineProperty`为每个属性设置getter和setter。当模板中使用了某个属性时,Vue会在首次渲染时将该属性作为依赖进行收集。这意味着,如果这个属性发生变化,Vue知道需要重新渲染哪些组件。

发布订阅模式是Vue实现组件更新的机制。当数据变化时,对应的setter会被触发,通知Vue进行视图更新。Vue内部有一个观察者列表,它会通知所有的观察者(即订阅者),也就是那些被依赖数据的组件,让它们更新视图。

最后,Vue使用虚拟DOM来高效地更新实际的DOM。虚拟DOM是一个轻量级的JavaScript对象,它描述了DOM树的结构。当需要更新视图时,Vue会先通过当前状态生成一个新的虚拟DOM树,然后与旧的虚拟DOM树进行比较,计算出最小的更新量,最后将这些更新应用到实际的DOM上。这种方法减少了不必要的DOM操作,从而优化了性能。

### 5.1.2 计算属性和侦听器的使用场景

计算属性(computed properties)和侦听器(watchers)是Vue中响应式系统的两个重要组成部分,它们在不同的使用场景下各有优势。

计算属性基于它们的依赖进行缓存。只有在相关依赖发生改变时,计算属性才会重新求值。这使得计算属性非常适合于那些需要依赖其他数据属性,并且只有在依赖项改变时才更新的场景,例如,根据用户的输入显示格式化过的金额。

```javascript
computed: {
  reversedMessage() {
    return this.message.split('').reverse().join('');
  }
}

侦听器则更多用于当数据变化时需要执行异步或开销较大的操作。当侦听的属性发生变化时,可以执行回调函数,进行复杂的逻辑处理。

watch: {
  question(newVal, oldVal) {
    this.answer = 'Waiting for you to stop typing...'
    this.getAnswer();
  }
}

5.2 事件驱动设计

5.2.1 Vue中的事件修饰符和按键修饰符

Vue.js提供了一系列的事件修饰符来处理事件,使得事件的处理更加简洁。这些修饰符包括 .stop .prevent .capture .self .once .passive 。例如, .stop 修饰符用于阻止事件冒泡, .prevent 用于阻止事件的默认行为。

<!-- 完整的写法 -->
<button @click.stop="doThis"></button>

<!-- 缩写 -->
<button @click.stop></button>

按键修饰符可以用来指定当某个键盘按键被按下时才触发相应的事件处理器,例如 .enter .tab .delete .esc 等。这对于处理表单输入特别有用,可以避免不必要的全局事件处理,提高程序的性能。

<input @keyup.enter="submit">

5.2.2 自定义指令与事件交互的高级应用

Vue还允许开发者创建自定义指令,这些指令可以封装更复杂的行为和事件处理。自定义指令提供了底层的DOM访问,适用于一些原生JavaScript API无法覆盖的交互场景。

创建自定义指令时,可以定义几个钩子函数,如 bind inserted update 等,以处理指令的生命周期事件。例如,下面的指令 v-focus 会在元素被插入到DOM后,自动将焦点设置到该元素上。

Vue.directive('focus', {
  // 当被绑定的元素插入到DOM中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus();
  }
});

在高级应用中,自定义指令可以和事件监听器一起使用,以实现特定的交互逻辑。比如,自定义指令可以绑定一个 clickoutside 事件,当用户点击元素外部的任何地方时,执行某些逻辑。

Vue.directive('clickoutside', {
  bind: function(el, binding, vnode) {
    function documentHandler(e) {
      // 判断点击事件是否在元素内部触发
      if (!(el === e.target || el.contains(e.target))) {
        // 调用指令中定义的处理函数
        binding.value(e);
      }
    }
    // 监听document的点击事件
    el.__vueClickOutside__ = documentHandler;
    document.addEventListener('click', documentHandler);
  },
  unbind: function(el, binding, vnode) {
    // 解绑事件监听器
    document.removeEventListener('click', el.__vueClickOutside__);
    delete el.__vueClickOutside__;
  }
});

在上述代码中,我们创建了一个自定义指令 v-clickoutside ,它会监听点击事件,并判断点击是否发生在绑定元素的外部,从而执行绑定的函数。这种方式在创建下拉菜单、模态框等组件时特别有用。

6. 音乐播放器界面布局与响应式设计

在当今移动优先的设计理念下,响应式设计显得尤为关键。一个好的音乐播放器不仅要有优雅的界面布局,还要在不同设备上保持良好的用户体验。本章节将详细介绍基于Element UI的音乐播放器界面布局实践,以及如何进行界面优化以实现响应式设计。

6.1 基于Element UI的布局实践

Element UI提供了一系列用于布局的组件,包括栅格系统和Flexbox布局工具,它们可以帮助我们快速构建出整洁且适应不同屏幕的用户界面。

6.1.1 响应式栅格系统应用

栅格系统是前端响应式布局的基础,Element UI的栅格系统基于24列布局,并且提供了12种预设的响应式断点。我们可以使用 el-row el-col 来快速构建复杂的响应式布局。

<template>
  <el-row :gutter="20">
    <el-col :span="8">
      <div class="grid-content bg-purple">内容</div>
    </el-col>
    <el-col :span="8">
      <div class="grid-content bg-purple">内容</div>
    </el-col>
    <el-col :span="8">
      <div class="grid-content bg-purple">内容</div>
    </el-col>
  </el-row>
</template>

<script>
export default {};
</script>

在上述示例中,我们创建了三列,每列在大屏上占据8份空间。Element UI的栅格系统支持媒体查询,可以通过设置断点来改变列数,使布局在不同屏幕尺寸下自动适应。

6.1.2 Flexbox布局技术的运用

对于复杂的布局,Element UI提供了基于Flexbox的布局工具,例如 el-container , el-header , el-main , 和 el-footer ,帮助我们构建灵活且一致的布局结构。

<template>
  <el-container>
    <el-header>头部</el-header>
    <el-main>主体内容</el-main>
    <el-footer>底部</el-footer>
  </el-container>
</template>

使用Flexbox布局的组件允许我们轻松地对内部元素进行垂直或水平对齐,调整间距,并处理复杂的布局排列。

6.2 音乐播放器界面优化

对界面进行优化是提升用户体验的关键一步。我们将探讨如何对界面组件进行自定义和优化,并利用媒体查询进行断点响应式调整。

6.2.1 界面组件的自定义与优化

Element UI组件库虽然提供了大量预制的组件,但在实际项目中我们往往需要根据具体需求对这些组件进行自定义和优化。比如,我们可以自定义播放器控制按钮的样式,以符合音乐播放器的品牌风格。

/* 自定义样式 */
.my-custom-button {
  border-radius: 50%;
  background-color: #00a1d6;
}

然后在Vue组件中引用这个样式类:

<template>
  <el-button class="my-custom-button">播放</el-button>
</template>

<style scoped>
.my-custom-button {
  /* 样式定义 */
}
</style>

6.2.2 媒体查询与断点响应式调整

使用媒体查询可以根据不同的屏幕尺寸调整样式。例如,我们可能希望在小屏幕上隐藏某些菜单项,在中等屏幕上显示它们但在侧边栏中,在大屏幕上则在顶部导航栏中显示。

/* 媒体查询示例 */
@media (max-width: 768px) {
  .hidden-sm-down {
    display: none;
  }
}

@media (min-width: 769px) and (max-width: 992px) {
  .hidden-md-up {
    display: none;
  }
}

@media (min-width: 993px) {
  .hidden-lg-up {
    display: none;
  }
}

在上面的示例中,我们定义了三个媒体查询断点来控制不同屏幕尺寸下元素的显示与隐藏。这样,我们的音乐播放器就可以根据不同设备的显示特性进行适当的调整,确保用户无论在何种设备上都能有良好的使用体验。

通过上述方法,我们可以实现一个既美观又实用的音乐播放器界面,并确保其在多设备上都能有良好的响应式表现。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文将展示如何使用Vue.js 2.x结合Element UI组件库开发一个音乐播放器应用程序。重点讲解了Vue.js的组件化特性、Element UI提供的UI元素,以及如何实现播放控制、歌曲搜索、响应式布局和数据处理等功能。项目中还将涉及使用HTML5 Audio API、处理网络请求以及提高用户交互体验的策略。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐