第一节:环境准备、项目结构详解、App.vue/main.js/uni.scss详解、各种引用(组件/js/css/静态资源)

一.  环境准备

1.  Hbuilder X

  下载地址:https://www.dcloud.io/hbuilderx.html

 

2.  微信开发工具

  下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

 

3.  使用步骤

  选中uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 微信开发者工具,即可在微信开发者工具里面体验 uni-app。

注:

(1). 微信开发者工具需要开启服务端口:小程序开发工具设置 -> 安全(目的是让HBuilder可以启动微信开发者工具)

(2). 如第一次使用,需配置微信开发者工具的安装路径。

    点击工具栏运行 -> 运行到小程序模拟器 -> 运行设置,配置相应小程序开发者工具的安装路径

(3). 自动启动失败,可用微信开发者工具手动打开项目(项目在unpackage/dist/dev/mp-weixin路径下)。

 

 

二. 项目结构详解

  详见官网:https://uniapp.dcloud.net.cn/tutorial/project.html

static目录 使用注意

  • 编译到任意平台时,static 目录下除不满足条件编译的文件,会直接复制到最终的打包目录,不会打包编译。非 static 目录下的文件(vue、js、css 等)只有被引用时,才会被打包编译。
  • cssless/scss 等资源不要放在 static 目录下,建议这些公用的资源放在自建的 common 目录下。

 

三. App.vue/main.js/uni.scss详解

 (详见官网:https://uniapp.dcloud.net.cn/collocation/main.html )

1.  main.js

main.js是 uni-app 的入口文件,主要作用是初始化vue实例、定义全局组件、使用需要的插件如 vuex、定义全局变量、方法等。

 注:全局变量主要通过 app.config.globalProperties 注册。

(1). 初始化vue3实例

import App from './App'
import { createSSRApp } from 'vue'
const app = createSSRApp(App)
export function createApp() {
	return {
		app
	}
}

(2). 定义全局变量

注册:

app.config.globalProperties.baseUrl = "xxxxxx";

调用:

import { getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
let data = proxy.baseUrl;

特别注意:

   上述getCurrentInstance+proxy的写法,仅支持再vue页面的script标签中使用,不支持再单独的js中用。

(3). 定义全局方法 

A. 以全局对象的形式注册

注册:

   比如:myUtils.js 中有几个方法,采用默认的形式进行导出,如下:

// 默认导出
export default {
	ajaxAsync1,
	ajaxAsync2,
	ajaxAsync3,
}

   默认导入的时候,会用一个对象进行接收,比如对象名为 $myUtils,里面包括上述三个方法,然后直接把这个对象定义为全局对象即可。

import myUtils from './js/myUtils.js'
app.config.globalProperties.$myUtils = myUtils;

调用:

import { getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
let data= await proxy.$myUtils.ajaxAsync1(xxxxxx);

B. 直接注册为全局方法

注册:

   myUtils.js中的方法以同上,myUtils2.js中的方法采用按需的方式导出,如下代码:

// 按需导出
export {
	ajaxAsync4,
	ajaxAsync5,
}

  分别将两个对象里的方法注册为全局方法

import myUtils from './js/myUtils.js'
//直接注册全局方法
for (let key in myUtils) {
	app.config.globalProperties[key] = myUtils[key];
}

import * as myUtils2 from './js/myUtils2.js'
//直接注册全局方法
for (let key in myUtils2) {
	app.config.globalProperties[key] = myUtils2[key];
}

调用:

import { getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
let data= await proxy.ajaxAsync1(xxxxxx);

 

2. App.vue

App.vue是uni-app的主组件,所有页面都是在App.vue下进行切换的,是页面入口文件。但App.vue本身不是页面,这里不能编写视图元素,也就是没有<template>。这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData。

(1).  应用生命周期

  注:应用生命周期仅可在App.vue中监听,在页面监听无效。

(2). 全局数据globalData

   这是一种简单的全局变量机制。这套机制在uni-app里也可以使用,并且全端通用(app、小程序、web)。

注册声明:

<script>
	export default {
		onLaunch: function() {},
		onShow: function() {},
		onHide: function() {},
		// 定义全局的数据
		globalData: {
			name: 'ypf',
			age: 18
		}
	};
</script>

使用:

<script setup>
	const { globalData } = getApp();
	console.log(globalData.name, globalData.age);
</script>

注:在单独的js文件中也可以直接使用。

(3). 全局样式

     在App.vue中,可以定义一些全局通用样式,例如需要加一个通用的背景色,首屏页面渲染的动画等都可以写在App.vue中。

注:    

     App.vue 中通过 @import 语句可以导入外联样式,一样作用于每一个页面。

     在App.vue定义样式变量无效,样式变量需要到uni.scss中定义。

<style>
	/*********************************************全局样式 *********************************************/
	/* 说明:
      1. 此处写的样式为全局样式,所有页面都生效
      2. 该页面不能定义 scss 样式变量,定义全局变量请到uni.scss文件中
	3. 可以导入文件,比如:  // @import '@/static/css/base.scss';
	4. 通过调试工具能看到,页面的最外层都是 page标签,所以可以通过设置page的样式,给整个页面生效
 
 */
    @import '@/static/css/base.scss';
	/* 通过page标签可以设置全局页面的样式 */
	page {
		background-color: #f8f8f8;
		font-family: 'Microsoft YaHei';
	}
</style>

 

3.  uni.scss

uni.scss文件的用途是为了方便整体控制应用的风格。比如按钮颜色、边框风格,uni.scss文件里预置了一批scss变量预置。主要有以下几个作用:

(1). 定于全局样式,每个页面都生效

    效果同在 app.vue 页面定义样式相同,通常更倾向在app.vue页面写全局样式

(2). 定义全局样式变量

声明:

// 1.定义自定义的全局的样式变量 (可以将变量单独写到一个文件里,这里引入即可)
@import '@/static/css/base.scss';
$ypf-color: orange;

使用:

    需要添加 lang="scss", HBuilderX 里面安装 scss 插件,运行的时候会自动安装该插件。

<style lang="scss">

// 默认就是局部样式   加scoped没有任何意义
.box {
	color: $ypf-color;
	border-radius: $radius;
}
</style>

(3). 重写uni-app内置的样式变量

   详见后面章节

(4). 重写uni-ui内置的样式变量

   详见后面章节

 

 

四. 各种引用(组件/js/css/静态资源)

(详见官网:https://uniapp.dcloud.net.cn/tutorial/page-component.html)

1. 组件

(1).  传统Vue2项目开发,引用组件需要导入 - 注册 - 使用三个步骤

<template>
	<view>
		<!-- 3.使用组件 -->
		<uni-rate text="1"></uni-rate>
	</view>
</template>
<script>
	// 1. 导入组件
	import uniRate from '@/components/uni-rate/uni-rate.vue';
	export default {
		components: { uniRate } // 2. 注册组件
	}
</script>

(2). Vue 3.x增加了script setup特性,将三步优化为两步,无需注册步骤,更为简洁

<template>
	<view>
		<!-- 2.使用组件 -->
		<uni-rate text="1"></uni-rate>
	</view>
</template>
<script setup>
	// 1. 导入组件
	import uniRate from '@/components/uni-rate/uni-rate.vue';
</script>

(3). uni-appeasycom机制,将组件引用进一步优化,开发者只管使用,无需考虑导入和注册,更为高效

<template>
	<view>
		<!-- 1.使用组件 -->
		<uni-rate text="1"></uni-rate>
	</view>
</template>
<script>
</script>

何为easycom机制?

  (详见官网:https://uniapp.dcloud.net.cn/collocation/pages.html#easycom)

  只要组件安装在项目根目录componentsuni_modules的components目录下,并符合components/组件名称/组件名称.vueuni_modules/插件ID/components/组件名称/组件名称.vue目录结构。就可以不用引用、注册,直接在页面中使用

  组件名称文件夹和组件名称名字要相同。  比如:components/ypf-table/ypf-table.vue

  easycom机制是默认开启的,可以再page.json中配置关闭。

 

2. js

js文件或script标签内(包括 renderjs 等)引入js文件时,可以使用相对路径和绝对路径(@符号默认指向根目录),形式如下

// 绝对路径,@指向项目根目录,在cli项目中@指向src目录
import add from '@/common/add.js';
// 相对路径
import add from '../../common/add.js';

 

3. css

  @import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径或绝对路径(@符号默认指向根目录),用;表示语句结束。

<style lang="scss">
    @import '@/static/css/variable.css';

    @import '../../css/variable.css';
</style>

   也可以使用url的写法

/* 绝对路径 */
@import url('/common/uni.css');
@import url('@/common/uni.css');
/* 相对路径 */
@import url('../../common/uni.css');

 

 

4. 静态资源

(1). <template>模板内引入静态资源

template内引入静态资源,如imagevideo等标签的src属性时,可以使用相对路径或者绝对路径,形式如下

<template>
    
    <!-- 绝对路径,/static指根目录下的static目录,在cli项目中/static指src目录下的static目录 -->
    <image class="logo" src="/static/logo.png"></image>
    <image class="logo" src="@/static/logo.png"></image>
    <!-- 相对路径 -->
    <image class="logo" src="../../static/logo.png"></image>
    <!-- 变量模式 -->
    <image class="logo" :src="myImg" ></image>

</template>
<script>
	import myImg from '@/static/images/logo.png'
</script>

注意

  • @开头的绝对路径以及相对路径会经过 base64 转换规则校验
  • 引入的静态资源在非 h5 平台,均不转为 base64。
  • H5 平台,小于 4kb 的资源会被转换成 base64,其余不转。

 

(2). 背景图片

   绝对路径使用:~@ 、@、或者直接/ 开头都可以

/* 绝对路径 */
background-image: url("~@/static/cvy.png");
background-image: url("@/static/cvy.png");
background-image: url("/static/cvy.png");
		
/* 相对路径 */
background-image: url("../../static/cvy.png");

  注:

  • @开头的绝对路径以及相对路径会经过 base64 转换规则校验
  • 不支持本地图片的平台,小于 40kb,一定会转 base64。(共四个平台 mp-weixin, mp-qq, mp-toutiao, app v2)
  • h5 平台,小于 4kb 会转 base64,超出 4kb 时不转。
  • 其余平台不会转 base64

 

(3). 字体图标

(参考官网:https://uniapp.dcloud.net.cn/tutorial/syntax-css.html#字体图标

uni-app 支持使用字体图标,使用方式与普通 web 项目相同,需要注意以下几点:

(1). 支持 base64 格式字体图标。

(2). 支持网络路径字体图标。

(3). 网络路径必须加协议头 https

(4). 小程序不支持在 css 中使用本地文件,包括本地的背景图和字体文件,需以 base64 方式方可使用。但是uni-app会进行自动转换,也就是说小程序也可以使用本地图标文件,但是需要注意以下几个规则:

  A. 为方便开发者,在字体文件小于 40kb 时,uni-app 会自动将其转化为 base64 格式;(换言之:字体图标大于40kb的本地文件,小程序中不能使用)

  B. 字体文件大于等于 40kb,仍转换为 base64 方式使用的话可能有性能问题,如开发者必须使用,则需自己将其转换为 base64 格式使用,或将其挪到服务器上,从网络地址引用;

  C. 字体文件的引用路径推荐使用以 ~@ 开头的绝对路径。

图标源码如下图:

iconfont.css 如下:

/* 导入字体图标 */
	@font-face {
	  font-family: "iconfont"; 
	  src: url('~@/static/custom-font/iconfont.ttf') format('truetype');
	}
	.iconfont {
	  font-family: "iconfont" !important;
	  font-size: 16px;
	  font-style: normal;
	  -webkit-font-smoothing: antialiased;
	  -moz-osx-font-smoothing: grayscale;
	}
	.icon-shouye:before {
	  content: "\e668";
	}
	.icon-touxiang-kong:before {
	  content: "\e660";
	}

在App.vue中全局引入图标样式

<style>
	/*每个页面公共css */
	@import '@/static/custom-font/iconfont.css';

</style>

使用:

<template>
	<view class="style-page">
		<view class="bg-view"></view>
		<text class="text iconfont icon-shouye"></text>
	</view>
</template>

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2023-01-06 16:44  Yaopengfei  阅读(1527)  评论(1编辑  收藏  举报