uniapp 实现类似v-loading加载效果

文章展示了如何在uniapp中通过创建自定义组件来实现加载动画效果,而不是使用内置的自定义指令。作者创建了一个名为uni-loading的组件,包含四个不同颜色的圆形,通过CSS动画实现了旋转和位移,从而达到加载指示器的效果。在需要的地方通过v-if和v-else控制组件的显示和隐藏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uniapp不支持自定义指令。

效果图如下:

在components下创建uni-loading同名目录和文件:

<template>
   // 代写代码  weixin781284440
	<view class="com__box">
		<view class="loading">
			<view class="shape shape-1"></view>
			<view class="shape shape-2"></view>
			<view class="shape shape-3"></view>
			<view class="shape shape-4"></view>
		</view>
	</view>
</template>

<style lang="scss">
	.com__box {
		position: absolute;
		top: 35%;
		left: calc((100% - 15px)/2);
	}

	.loading {
		width: 30px;
		height: 30px;
		position: relative;
		animation: animationContainer 1s ease infinite;
	}

	.shape {
		width: 10px;
		height: 10px;
		border-radius: 50%;
		position: absolute;
	}

	.shape-1 {
		background-color: #1875e5;
		left: 0;
		animation: animationShape1 0.5s ease infinite alternate;
	}

	.shape-2 {
		background-color: #c5523f;
		right: 0;
		animation: animationShape2 0.5s ease infinite alternate;
	}

	.shape-3 {
		background-color: #499255;
		bottom: 0;
		animation: animationShape3 0.5s ease infinite alternate;
	}

	.shape-4 {
		background-color: #f2b736;
		right: 0;
		bottom: 0;
		animation: animationShape4 0.5s ease infinite alternate;
	}

	@keyframes animationContainer {
		0% {
			transform: rotate(0);
		}

		100% {
			transform: rotate(360deg);
		}
	}

	@keyframes animationShape1 {
		0% {
			transform: translate(0, 0);
		}

		100% {
			transform: translate(20px, 20px);
		}
	}

	@keyframes animationShape2 {
		0% {
			transform: translate(0, 0);
		}

		100% {
			transform: translate(-20px, 20px);
		}
	}

	@keyframes animationShape3 {
		0% {
			transform: translate(0, 0);
		}

		100% {
			transform: translate(20px, -20px);
		}
	}

	@keyframes animationShape4 {
		0% {
			transform: translate(0, 0);
		}

		100% {
			transform: translate(-20px, -20px);
		}
	}
</style>

在需要使用的文件中引入,通过v-if和v-else去判断加载。

<think>嗯,用户想了解在UniApp中如何实现数据服务。首先,我需要回忆一下UniApp的数据处理机制。UniApp基于Vue.js,所以数据驱动视图的概念应该适用。数据服务通常涉及数据获取、状态管理和组件通信。 用户之前的引用提到了雷达图实现和父子组件传值,这可能意味着他们关心如何获取数据并传递给组件。数据服务可能需要从API获取数据,存储和管理状态,然后在组件中使用。 首先,数据获取可以使用uni.request,这是UniApp内置的HTTP请求方法。可能需要展示一个示例代码,说明如何发起GET或POST请求,处理响应数据。 然后是状态管理。对于小型应用,可以使用Vue的响应式数据,通过data属性管理。但如果是复杂应用,可能需要Vuex。但用户之前的引用中没有提到Vuex,所以可能需要简单说明两种方式,并给出示例。 接下来是数据绑定。在UniApp中,数据绑定和Vue类似,使用双大括号和指令如v-for。需要展示如何将数据渲染到视图,比如列表渲染。 另外,用户提到了组件传值,之前的引用中有父子组件的例子。数据服务可能需要将获取的数据传递给子组件,这里可以用props。同时,子组件可能需要通过事件向父组件传递数据,用$emit。 还要考虑本地存储,比如uni.setStorageSync,用于持久化数据。可能用户需要临时存储或缓存数据,这时候可以使用本地存储方法。 在示例部分,可以综合这些知识点,比如在页面加载时请求数据,存储到data,然后传递给子组件显示。同时,处理加载状态和错误信息,提升用户体验。 相关问题部分,用户可能想知道数据缓存、跨页面通信、性能优化、数据加密和实时更新。这些问题都是数据服务常见的扩展点,需要涵盖。 需要确保回答结构清晰,分步骤说明,每个部分都有代码示例。同时,引用之前的参考内容,比如组件传值的方法,但主要围绕数据服务展开。还要注意使用正确的中文术语和LaTeX格式,不过用户的问题可能不涉及数学公式,所以可能不需要使用数学表达式,但根据系统指令,行内表达式需要用$...$。不过当前问题可能不需要数学公式,可能可以忽略,但需要检查是否有必要的地方。 总结,回答应包括数据获取、状态管理、组件通信、本地存储,以及示例和相关问题。确保代码示例正确,符合UniApp的语法,比如使用uni.request,并在data中定义变量。同时,引用之前的父子组件传值示例,说明如何传递数据。</think>在UniApp实现数据服务需要结合网络请求、状态管理和本地存储等技术手段。以下是实现数据服务的方法与示例说明: --- ### 一、基础数据服务实现步骤 #### 1. 数据请求(API交互) 使用UniApp内置的`uni.request`实现网络请求: ```javascript // 在页面或Vuex中定义方法 export default { data() { return { apiData: [], loading: false } }, methods: { fetchData() { this.loading = true uni.request({ url: &#39;https://api.example.com/data&#39;, method: &#39;GET&#39;, success: (res) => { this.apiData = res.data uni.setStorageSync(&#39;cachedData&#39;, res.data) // 本地缓存 }, fail: (err) => { console.error(&#39;请求失败:&#39;, err) }, complete: () => { this.loading = false } }) } }, mounted() { this.fetchData() } } ``` #### 2. 状态管理 - **简单场景**:使用Vue响应式数据 ```javascript data() { return { userInfo: { name: &#39;张三&#39;, role: &#39;admin&#39; } } } ``` - **复杂场景**:集成Vuex ```javascript // store/index.js export default new Vuex.Store({ state: { globalData: null }, mutations: { setGlobalData(state, payload) { state.globalData = payload } } }) ``` #### 3. 数据绑定 在模板中直接使用响应式数据: ```html <view v-for="(item, index) in apiData" :key="index"> {{ item.title }} </view> ``` --- ### 二、进阶数据服务模式 #### 1. 父子组件通信 **父组件传递数据**: ```html <child-component :dataList="apiData" @refresh="fetchData" /> ``` **子组件接收与响应**: ```javascript // ChildComponent.vue export default { props: [&#39;dataList&#39;], methods: { handleRefresh() { this.$emit(&#39;refresh&#39;) // 触发父组件方法 } } } ``` #### 2. 本地持久化 ```javascript // 存储 uni.setStorageSync(&#39;authToken&#39;, &#39;xxxxxx&#39;) // 读取 const token = uni.getStorageSync(&#39;authToken&#39;) // 删除 uni.removeStorageSync(&#39;authToken&#39;) ``` --- ### 三、完整示例场景 ```html <template> <view> <view v-if="loading">加载中...</view> <view v-else> <data-chart :chartData="apiData" /> <!-- 引用可视化组件 --> <button @click="fetchData">刷新数据</button> </view> </view> </template> <script> import DataChart from &#39;@/components/DataChart.vue&#39; export default { components: { DataChart }, data() { return { loading: false, apiData: [] } }, methods: { async fetchData() { try { const res = await uni.request({ url: &#39;/api/data&#39; }) this.apiData = this.processData(res.data) } catch (e) { uni.showToast({ title: &#39;数据加载失败&#39;, icon: &#39;none&#39; }) } }, processData(raw) { // 数据预处理逻辑 return raw.map(item => ({ ...item, value: item.value * 100 })) } } } </script> ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ღ张明宇࿐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值