| 内容 | 参考链接 |
|---|---|
| Vue3.0 项目启动 | Vue3.0 项目启动(打造企业级音乐App) |
| Vue3.0项目——打造企业级音乐App(一) | Tab栏、轮播图、歌单列表、滚动组件 |
| Vue3.0项目——打造企业级音乐App(二) | 图片懒加载、v-loading指令的开发和优化 |
文章目录
vue3.0-music
该项目为移动端的项目,我们要设置缩放比例为 1,并且禁止用户双击缩放。

在 main.js 中引入样式文件
import '@/assets/scss/index.scss'
总体效果图:

header.vue 组件
<template>
<div class="header">
<span class="icon"></span>
<h1 class="text">Joyful Music</h1>
<router-link class="mine" to="/user">
<i class="icon-mine"></i>
</router-link>
</div>
</template>
<script>
export default {
name: 'm-header'
}
</script>
<style lang="scss" scoped>...</style>

tab 组件
<template>
<div class="tab">
<router-link
class="tab-item"
v-for="tab in tabs"
:key="tab.path"
:to="tab.path"
>
<span class="tab-link">
{{tab.name}}
</span>
</router-link>
</div>
</template>
<script>
export default {
name: 'tab',
data() {
return {
tabs: [
{
name: '推荐',
path: '/recommend'
},
{
name: '歌手',
path: '/singer'
},
{
name: '排行',
path: '/top-list'
},
{
name: '搜索',
path: '/search'
}
]
}
}
}
</script>
<style lang="scss" scoped>...</style>

App.vue 组件
<template>
<m-header></m-header>
<tab></tab>
<router-view></router-view>
</template>
<script>
import Header from '@/components/header/header.vue'
import Tab from '@/components/tab/tab.vue'
export default {
components: {
MHeader: Header,
Tab
}
}
</script>
<style lang="scss"></style>
./router/index.js 文件
import { createRouter, createWebHashHistory } from 'vue-router'
import Recommend from '@/views/recommend'
import Singer from '@/views/singer'
import TopList from '@/views/top-list'
import Search from '@/views/search'
const routes = [
{
path: '/',
redirect: '/recommend' // 重定向
},
{
path: '/recommend',
component: Recommend
},
{
path: '/singer',
component: Singer
},
{
path: '/top-list',
component: TopList
},
{
path: '/search',
component: Search
}
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router
./server/base.js 文件
import axios from 'axios'
const ERR_OK = 0
// 开发环境下这样定义baseURL
const baseURL = '/'
axios.defaults.baseURL = baseURL
export function get(url, params) {
return axios.get(url, {
params
}).then((res) => {
const serverData = res.data
if (serverData.code === ERR_OK) {
return serverData.result
}
}).catch((e) => {
console.log(e)
})
}
./server/recommend.js 文件
import { get } from './base'
export function getRecommend() {
return get('/api/getRecommend')
}
recommend.vue 组件
<template>
<div class="recommend">
推荐页面
</div>
</template>
<script>
import { getRecommend } from '@/service/recommend'
export default {
name: 'recommend',
async created() {
const result = await getRecommend()
console.log(result)
}
}
</script>

轮播图效果使用的是 BetterScroll 2.0 参考链接

./base/slider/use-slider.js 文件
new BScroll() 可以接收多个参数,第二个参数可以是对象的形式,里面添加多个参数import BScroll from '@better-scroll/core'
import Slide from '@better-scroll/slide'
import { onMounted, onUnmounted, ref } from 'vue'
BScroll.use(Slide)
export default function useSlider(wrapperRef) {
const slider = ref(null)
const currentPageIndex = ref(0)
onMounted(() => {
const sliderVal = slider.value = new BScroll(wrapperRef.value, {
click: true,
scrollX: true, // 横向滚动
scrollY: false,
momentum: false, // 避免惯性动画带来的快速滚动时的闪烁的问题和快速滑动时一次滚动多页的问题
bounce: false, // 避免在循环衔接的时候出现闪烁
probeType: 2, // 在用户拖动 slide 时,实时获取到 slide 的 PageIndex 的改变,需要设置为 2 or 3
slide: true
})
sliderVal.on('slideWillChange', (page) => {
currentPageIndex.value = page.pageX
})
})
// 销毁
onUnmounted(() => {
slider.value.destroy()
})
return {
slider,
currentPageIndex
}
}
./component/base/slider/slider.vue 组件
<template>
<div class="slider" ref="rootRef">
<div class="slider-group">
<div
class="slider-page"
v-for="item in sliders"
:key="item.id"
>
<a :href="item.link">
<img :src="item.pic"/>
</a>
</div>
</div>
<div class="dots-wrapper">
<span
class="dot"
v-for="(item, index) in sliders"
:key="item.id"
:class="{'active': currentPageIndex === index}">
</span>
</div>
</div>
</template>
<script>
import { ref } from 'vue'
import useSlider from './use-slider'
export default {
name: 'slider',
props: {
sliders: {
type: Array,
default() {
return []
}
}
},
setup() {
const rootRef = ref(null)
const { currentPageIndex } = useSlider(rootRef)
useSlider(rootRef)
return {
rootRef,
currentPageIndex
}
}
}
</script>
<style lang="scss" scoped>...</style>
./views/recommend.vue 组件
<template>
<div class="recommend">
<div class="slider-warpper">
<div class="slider-content">
<slider v-if="sliders.length" :sliders="sliders"></slider>
</div>
</div>
</div>
</template>
<script>
import { getRecommend } from '@/service/recommend'
import Slider from '@/components/base/slider/slider'
export default {
name: 'recommend',
components: {
Slider
},
data() {
return {
sliders: []
}
},
async created() {
const result = await getRecommend()
// 拿到数据
this.sliders = result.sliders
}
}
</script>
效果图如下:

./components/scroll/use-scroll.js 文件
observe-dom 插件特性:
import BScroll from '@better-scroll/core'
import ObserveDOM from '@better-scroll/observe-dom'
import { onMounted, onUnmounted, ref } from 'vue'
BScroll.use(ObserveDOM)
export default function useScroll(warpperRef, options) {
const scroll = ref(null)
onMounted(() => {
scroll.value = new BScroll(warpperRef.value, {
observeDOM: true,
...options
})
})
onUnmounted(() => {
scroll.value.destroy()
})
}
./component/scroll/scroll.vue 组件
<template>
<div ref="rootRef">
<slot></slot>
</div>
</template>
<script>
import useScroll from './use-scroll'
import { ref } from 'vue'
export default {
name: 'scroll',
// 组件的默认行为
props: {
click: {
type: Boolean,
default: true
}
},
setup(props) {
const rootRef = ref(null)
useScroll(rootRef, props)
return {
rootRef
}
}
}
</script>
./views/recommend.vue 组件
<template>
<div class="recommend">
<scroll class="recommend-content">
<div>
<div class="slider-wrapper">
<div class="slider-content">
<slider v-if="sliders.length" :sliders="sliders"></slider>
</div>
</div>
<div class="recommend-list">
<h1 class="list-title">热门歌单推荐</h1>
<ul>
<li
v-for="item in albums"
class="item"
:key="item.id"
>
<div class="icon">
<img width="60" height="60" :src="item.pic">
</div>
<div class="text">
<h2 class="name">
{{ item.username }}
</h2>
<p class="title">
{{item.title}}
</p>
</div>
</li>
</ul>
</div>
</div>
</scroll>
</div>
</template>
<script>
import { getRecommend } from '@/service/recommend'
import Slider from '@/components/base/slider/slider'
import Scroll from '@/components/base/scroll/scroll'
export default {
name: 'recommend',
components: {
Slider,
Scroll
},
data() {
return {
sliders: [],
albums: []
}
},
async created () {
const result = await getRecommend()
this.sliders = result.sliders
this.albums = result.albums
}
}
</script>
不积跬步无以至千里 不积小流无以成江海
点个关注不迷路,持续更新中…
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU