uniapp入门学习

本文介绍了uni-app,一个基于vue.js的跨平台开发框架,用于构建网页、安卓、苹果及各小程序应用。详细讲解了uni-app的开发方式、项目结构、样式处理、基本语法、事件处理、组件使用及生命周期等核心概念,并提供了实际操作示例。

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

uni-app介绍

什么是ui-app

ui-app是一个使用vue.js语法来开发所有前端应用的框架
(网页应用、安卓应用、苹果应用、各种小程序应用(微信、qq、支付宝等))
##线上产品
csdn ,开源中国,咪咕商城、中国银联、招商银行等等

ui-app社区和规模

380万开发者、几十万应用案例、8.5亿手机端用户、数千款ui-app插件、70+微信/qq群

uni-app基础

ui-app初体验

开发方式

1.使用DCloud的hbuilderX快速开发
2.使用脚手架来快速搭建和开发

  1. 全局安装
    npm install -g @vue/cli

  2. 创建项目
    vue create -p dcloudio/uni-preset-vue my-project

  3. 启动项目
    npm run dev:mp-weixin

  4. 微信小程序开发者工具导入dist在这里插入图片描述在这里插入图片描述

  • 搭建过程可能出现vue和vue-template-complier版本不一致的问题。。。此时根据提示,重新安装对应的vue版本即可。npm install vue@2.6.10然后再重新运行项目 npm run dev:mp-weixin

项目结构介绍

项目目录

在这里插入图片描述 public ->index.html 给uiapp 做网页应用, 提供模板的功能
.gitignore ->git管理文件
babel.config.js ->js版本管理 比如es5转es6
package.json\package-lock.json ->node项目必备的包的描述文件
postcss.config.js->定义如何编译css代码,添加什么前缀、版本啊
README.md ->编写文字给用户看
tsconfig.json ->如果项目用js开发,可能会对语法进行规范,在这里进行配置
src中的目录结构:
在这里插入图片描述
pages:页面
static:静态资源(不要放样式)
App.vue:整个应用启动做的事情
main.js:入口文件(增加函数、方法等可以在这里定义)
pages.js:新增页面时,既要在pages增加文件,同时也需要在这里面配置文档路径、标题等。这里面有个globalStyle定义全局窗口样式(标题、文字、颜色等) (路劲谁放在前面谁就是首页)
uni.scss:这里是uni-app内置的常用样式变量
在这里插入图片描述

样式和sass

样式和sass

uniapp中直接支持小程序的rpx和h5的vw、vh

  • rpx是小程序中的单位,750rpx=屏幕的宽度
  • vh、vw是h5中的单位,100vh=屏幕的高度,100vm=屏幕的宽度

uniapp中内置有sass的配置了,怎么使用?

  1. 首先全局安装对应的依赖
npm install sass-loader node-sass
  1. vue组件中,在style标签上加入属性<style lang='scss'>

基本演示代码(pages/index2/index.html):

<template>
	<view class="content">
		  <view class="rpx">rpx</view> 
          <view class="vw">vw</view>
          <view class="sass" >sass</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {

		},
		methods: {

		}
	}
</script>

<style lang="scss">
	/*rpx是小程序中的单位,750rpx=屏幕的宽度*/
	.rpx{
        width: 750rpx;
        height: 100px;
        background-color: aqua;
    }
    .vw{
        /*vh、vw是h5中的单位,100vh=屏幕的高度,100vm=屏幕的宽度*/
        width: 50vw;
        height: 100px;
        background-color: tan;

    }
    .content{
        .sass{
            background-color: red;
            color:$uni-text-color-grey;//使用uni.scss里面定义好的颜色
        }

    }
</style>

在这里插入图片描述

基本语法

数据的展示
  1. js里data中定义数据
  2. template通过{{数据}}展示
<view>{{msg}}</view>
  1. 在标签属性上通过:data-index=‘数据’使用
 <view :data-color="color">color</view>
数据的循环
  1. 通过特定的语法v-for将数据显示
  2. item和index分别为循环项和循环索引
  3. :key指定唯一的属性,用来提高循环效率
  <view v-for="(item,index) in arr" :key="item.id">{{item.id}}--{{item.text}}--{{index}}</view>
data(){
	return{
		arr:[
		     {id:0,text:"苹果"},
			{id:1,text:"香蕉"},
			{id:2,text:"李子"}
			
		]
	}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020051300474736.png

条件编译

动态显示DOM元素

  1. v-if
  2. v-show
<view v-show="false">v-show</view>
<view v-if="false">v-if</view>
<view v-show="isShow">显示或隐藏</view>

区别

(1)手段:

v-if是动态的向DOM树内添加或者删除DOM元素;

v-show是通过设置DOM元素的display样式属性控制显隐;

(2)编译过程:

v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;

v-show只是简单的基于css切换;

(3)编译条件:

v-if是惰性的,如果初始条件为假,则什么也不做;只有在条件第一次变为真时才开始局部编译(编译被缓存?编译被缓存后,然后再切换的时候进行局部卸载);

v-show是在任何条件下(首次条件是否为真)都被编译,然后被缓存,而且DOM元素保留;

(4)性能消耗:

v-if有更高的切换消耗;

v-show有更高的初始渲染消耗;

(5)使用场景:

v-if适合运营条件不大可能改变;

v-show适合频繁切换。

计算属性
  1. 可以理解是对data数据的加工或者过滤能力
  2. 通过computed来定义计算属性
data(){
   money:1000
},
computed:{
		//把cnMoney看成是data中的普通数据一样使用
		cnMoney(){
			return "$"+this.money;
		}
	}
 <view>{{cnMoney}}</view>

在这里插入图片描述

事件

在这里插入图片描述在这里插入图片描述

事件的使用:
1.注册事件@click="handleClick"
2.methods中定义事件监听函数

在这里插入图片描述
3.事件的传参

 <view  data-index="11"  @tap="handleClick(1,$event)">click me</view>
<view data-index="11" @tap="handleClick(2,$event)">click me</view><!--data-index自定义属性传参通过event.currentTarget.dataset.index获取-->
methods: {
			handleClick(index,event){
				console.log(index);
				console.log(event);
				console.log(event.currentTarget.dataset.index);				
			}
},

组件

组件的简单使用
  1. 组件的定义
    src目录下新建文件夹componenets
    components下新建组件*.vue
    在这里插入图片描述
<template>
  <image src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1285056959,3836499669&fm=11&gp=0.jpg"  />
</template>

<script>
export default {

}
</script>

<style>
.img-border{
  border-radius: 50%;
}
</style>
  1. 组件的引入
    页面引入:import 组件名 form '组件路径'

  2. 组件的注册
    页面实例中,新增属性compontents
    属性components是一个对象,把组件放进去注册

  3. 组件的使用
    在页面标签中,直接使用引入的组件<组件><组件>

<template>
	<view class="content">

	<img-border></img-border>
	</view>
</template>

<script>
//引入自定义组件
import imgBorder from "@/components/img-border"//@代表找到src路径
	export default {
		//注册组件
			//Component Object
		components:{
			imgBorder
		},
	
	};
</script>

<style lang="scss">
	
</style>

在这里插入图片描述

组件传参
父组件向子组件传递参数,通过属性的方式

父组件

<template>
	<view class="content">
<!--组件使用-->
	<img-border :src="src1"></img-border><!--传参src给子组件img-border-->
	<img-border :src="src2"></img-border>
	</view>
</template>

<script>
//2引入自定义组件
import imgBorder from "@/components/img-border"//@代表找到src路径
	export default {
		data(){
			return{
				src1:"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1285056959,3836499669&fm=11&gp=0.jpg",
				src2:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1589372184891&di=fc7c7c3a7b99b72b6900ab289af1a96e&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201807%2F05%2F20180705103723_U5EFY.jpeg"
			}
		},
		//3注册组件
			//Component Object
		components:{
			imgBorder
		}
		
	
	}
</script>

<style lang="scss">
	/*rpx是小程序中的单位,750rpx=屏幕的宽度*/
     /*vh、vw是h5中的单位,100vh=屏幕的高度,100vm=屏幕的宽度*/
</style>

子组件

<template>
<!--要把props中传入的指=值看成是data中的变量一样来使用-->
  <image class="img-border" :src="src"  />
</template>

<script>
export default {
  //声明要接受的 父组件传递过来的属性
  props:{
    src:String//这个src跟父组件中那个属性名保持一致

  }

}
</script>

<style>
.img-border{
  border-radius: 50%;
}

</style>

在这里插入图片描述

子组件向父组件传递参数,通过触发事件的方式

子组件通过触发事件的方式向父组件传值,父组件通过监听事件的方式来接收数据

例子:点击图片的时候把图片路径打印到页面

子组件

<template>
<!--要把props中传入的指=值看成是data中的变量一样来使用-->
  <image class="img-border" :src="src"  @click="handleClick"/>
</template>

<script>
export default {
  //声明要接受的 父组件传递过来的属性
  props:{
    src:String//这个src跟父组件中那个属性名保持一致

  },
  methods:{
    handleClick(){
      /*子组件向父组件传递数据 通过触发事件this.$emit("自定义的事件名称","要传递的参数");*/
      this.$emit("srcChange",this.src);

    }
  }

}
</script>

<style>
.img-border{
  border-radius:50%;
}
</style>

父组件

<template>
	<view class="content">
	<!--组件使用-->
	<view class="hh">
		子组件传递过来的路径:{{src}}
	</view>
	<img-border @srcChange="handleSrcChange" :src="src1"></img-border>
	<img-border @srcChange="handleSrcChange" :src="src2"></img-border>
	</view>
</template>

<script>
//2引入自定义组件
import imgBorder from "@/components/img-border"//@代表找到src路径
	export default {
		data(){
			return{
				src:"",
				src1:"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1285056959,3836499669&fm=11&gp=0.jpg",
				src2:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1589372184891&di=fc7c7c3a7b99b72b6900ab289af1a96e&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201807%2F05%2F20180705103723_U5EFY.jpeg"
			}
		},
		//3注册组件
			//Component Object
		components:{
			imgBorder
		},
		methods:{
			handleSrcChange(e){
				console.log(e)
				this.src=e;
			}
		}
		
	
	}
</script>

<style lang="scss">
	/*rpx是小程序中的单位,750rpx=屏幕的宽度*/
     /*vh、vw是h5中的单位,100vh=屏幕的高度,100vm=屏幕的宽度*/
	 .hh{
		 font-size: 10px;
		 height: 5vh;

	 }
</style>

使用全局数据传递参数

组件之间还有很多不是父子组件的关系,这些组件之间共享数据就没法使用上面知识点,全局共享数据的方法如下:
通过挂载vue的原型 上
只要有Vue的地方,可以通过vue.prototype增加一些变量和函数
,就可以通过this.来获取这些变量或者方法。(一般写在main.js)

vue.prototype.baseURL="http://baidu.com"

通过globalData的方式

global Data:{
   base:"www.360.com"
}

App.vue中声明globalData,在任意组件可以通过getApp().globalData.base拿到数据(getApp()方法返回一个应用实例)

–vuex
–本地存储

组件插槽
  • 标签其实也是数据的一种,想实现动态的给子组件传递标签,就用插槽slot
  • 通过slot实现占位符
    插槽使用:

父组件:

<template>
	<view class="content">
      <my-form>
          <view><!--这级以下标签就代替了了组件my-form的slot--->
              <input type="text"><!--小程序中输入框没有默认颜色-->
              <radio></radio>
              <checkbox></checkbox>
          </view>
        
      </my-form>
    </view>
</template>

<script>
import myForm from "@/components/my-form"
	export default {
        components:{
            myForm
        },
	}
</script>

<style lang="scss">
	/*rpx是小程序中的单位,750rpx=屏幕的宽度*/
	
  /*vh、vw是h5中的单位,100vh=屏幕的高度,100vm=屏幕的宽度*/
  
   
</style>

子组件:

<template>
  <view class="form">
       <view class="form-title">标题</view>
		<view class="form-content">
            <slot></slot>    
        </view> 
	</view>
</template>

<script>
export default {

}
</script>

<style>

</style>

在这里插入图片描述

生命周期

介绍:

  • uniapp框架的生命周期结合了vue和微信小程序的生命周期
  • 全局的APP中使用onLaunch表示应用启动时
//整个应用启动
		onLaunch: function() {//常用
			console.log('App Launch 应用启动')
		},
		//应用被看到
		onShow: function() {
			console.log('App Show')
		},
		//应用被隐藏
		onHide: function() {
			console.log('App Hide')
		}
  • 页面中使用onLoad或者onShow分别表示页面加载完毕时和页面显示时
	//页面加载完毕
		onLoad() {
			console.log("页面加载完毕")

        },
        //页面被看到
        onShow(){
            console.log("页面被看到");
            
        },
  • 组件中使用mounted组件挂载完毕时
 mounted(){
        console.log("my-form组件挂载完毕")
    }

### UniApp 入门教程与基础知识 #### 一、UniApp简介 UniApp 是一个基于 Vue.js 的跨平台应用开发框架,允许开发者编写一次代码即可部署到多个平台,包括微信小程序、H5网页以及原生移动应用程序。这种高效的工作流程极大地提高了开发效率,并减少了维护成本[^1]。 #### 二、安装配置与发展环境设置 为了开始使用 UniApp 进行项目构建,首先需要完成必要的软件安装和环境准备。这通常涉及到 Node.js 和 npm (Node Package Manager) 的安装,接着是 HBuilderX IDE 或者其他支持插件的编辑器的选择。此外还需要下载并安装 DCloud 提供的官方工具链来简化整个过程[^2]。 #### 三、核心概念理解 掌握几个重要的术语对于理解和运用此框架至关重要: - **页面(Page)**:类似于 HTML 文件,在其中定义视图结构; - **组件(Component)**:可重用的小型UI部件集合体; - **API接口调用**:用于实现数据交互和服务端通信功能的方法集; #### 四、创建首个简单程序实例 当熟悉了上述基础理论后就可以尝试动手实践了。按照官方提供的模板或者自己构思一个小项目作为起点是非常好的做法。比如制作一款待办事项列表(Todo List),它能够很好地展示如何组合各种内置控件以达到预期效果的同时也锻炼解决问题的能力。 ```html <template> <view class="container"> <!-- 输入框 --> <input v-model="newItemText" placeholder="请输入新项"/> <!-- 添加按钮 --> <button @click="addItem">添加</button> <!-- 列表显示区域 --> <ul> <li v-for="(item, index) in itemsList" :key="index">{{ item }}</li> </ul> </view> </template> <script> export default { data() { return { newItemText: '', itemsList: [] } }, methods: { addItem(){ this.itemsList.push(this.newItemText); this.newItemText=''; } } } </script> ``` #### 五、深入学习路径建议 随着技能水平的增长,可以逐步接触更加复杂的主题和技术细节,例如但不限于状态管理模式Vuex的应用场景分析、自定义样式设计原则探讨或是第三方库集成技巧分享等内容。这些都是提高个人技术水平的有效途径之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值