网站首页 > 技术文章 正文
样式和sass
# 同时支持小程序的rpx和h5的vw,vh长度单位
# 内置有sass的配置了,只需要安装对应依赖即可
npm install sass-loader node-sass
# 使用sass,在style标签中加入如下属性即可
<style lang='scss'>
</style>
rpx/vw/vh
<view class="content">
<view class="rpx">rpx</view>
<view class="vw">vw</view>
</view>
<style>
/* 用rpx来设置宽高 */
.rpx {
/* 在小程序中,750rpx相当于屏幕的整体宽度 */
width:750rpx;
height: 100px;
background-color: aqua;
}
/* 用vh,vw来设置宽高 */
.vw {
/* vw: h5的单位 100vw=屏幕的宽度 100vh=屏幕的高度 */
width:50vw;
height: 100px;
background-color: pink;
}
</style>
效果:
sass语法
<view class="content">
<view class="sass">sass</view>
</view>
<!-- content是固定写法 -->
.content{
.sass{ <!-- .class值 -->
background-color: red;
}
}
效果:
数据展示
普通文本数据
<!-- 1. 在js的data中定义数据 -->
<script>
export default {
data() {
return {
title:"这是一个title值"
};
}
}
</script>
<!-- 2. 在template页面通过 {{ 数据 }} 来展示数据 -->
<view class="data_title">
{{title}}
</view>
将数据当做标签的属性值来使用
语法
:data-xxx="xxx"
示例
<!-- 1. 在js的data中定义数据 -->
<script>
export default {
data() {
return {
title:"这是一个title值",
color:"red"
};
}
}
</script>
<!-- 将数据当做标签的属性值来使用,属性名为data-color -->
<view class="content">
<view :data-color='color'>
color
</view>
</view>
效果展示:
数据循环
<!-- 定义数据 -->
<script>
export default {
data() {
return {
list:[
{
id:1,
text:"苹果"
},
{
id:2,
text:"樱桃"
},
{
id:3,
text:"香蕉"
},
{
id:4,
text:"葡萄"
}
]
};
}
}
</script>
<!-- 循环展示数据 -->
<view class="content">
<!-- 通过view标签来显示 -->
<view class="" v-for="(item,index) in list" :key="item.id">
{{index}}---{{item.text}}
</view>
</view>
条件判断
<!--
v-if # 隐藏标签会删除标签
v-show # 隐藏标签是通过加hidden属性来隐藏的
-->
<!--
如果标签很频繁的显示隐藏显示隐藏,就用v-show来判断,性能会比较好
-->
<view class="content">
<!-- 通过isshow的true false 来控制标签显示 -->
<view class="vif" v-if="isshow">
v-if
</view
<view class="vshow" v-show="isshow">
v-show
</view>
<view class="vshow" v-else>
v-show
</view>
</view>
计算属性
类似django模板语法中的自定义函数
<!-- 使用计算属性 -->
<template>
<view class="content">
<view>{{start_money}}</view>
</view>
</template>
<script>
export default {
data() {
return {
money:1000
};
},
// 计算属性
computed:{
start_money(){
return "#34; + this.money
},
}
}
</script>
只展示ID小于等于1的数据
<template>
<view class="content">
<view v-for="item in filter_list" :key="item.id">{{item.text}}</view>
</view>
</template>
<script>
export default {
data() {
return {
money:1000,
list:[
{
id:1,
text:"苹果"
},
{
id:2,
text:"樱桃"
},
{
id:3,
text:"香蕉"
},
{
id:4,
text:"葡萄"
}
]
};
},
// 计算属性
computed:{
filter_list(){
// 这里的=>是指针
return this.list.filter(v=>v.id<=1)
}
}
}
</script>
数据循环+条件判断
这里建议使用computed计算属性来实现,用下面方法也可以实现
<template>
<view class="content">
<view>
<view v-for="item in list" v-if="item.id<=3" :key="item.id">{{item.text}}</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
money:1000,
list:[
{
id:1,
text:"苹果"
},
{
id:2,
text:"樱桃"
},
{
id:3,
text:"香蕉"
},
{
id:4,
text:"葡萄"
}
]
};
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss">
</style>
事件
# 注册事件的语法:
@click="函数名"
# 定义监听函数,在methods中定义
<script>
export default {
data() {
return {
};
},
# 注册事件函数
methods:{
}
}
</script>
# 在事件中传参
<view @click="Add(number)">点击事件</view>
methods:{
# 接收参数
Add(number){
this.number = number + 1
}
}
绑定事件
<template>
<view class="content">
<view>{{ number }}</view>
<view @click="Add()">点击事件</view>
</view>
</template>
<script>
export default {
data() {
return {
number:0
};
},
methods:{
Add(){
this.number += 1
}
}
}
</script>
<style lang="scss">
</style>
事件中传参
<template>
<view class="content">
<view>{{ number }}</view>
<view @click="Add(number)">点击此处,数字(+1)</view>
</view>
</template>
<script>
export default {
data() {
return {
number:0
};
},
methods:{
Add(number){
this.number = number + 1
}
}
}
</script>
<style lang="scss">
</style>
获取标签中的自定义属性的值
<template>
<view class="content">
<view>{{ number }}</view>
<view>{{number2}}</view>
<!-- 将整个事件对象传入Add()函数中 -->
<view data-number2="10" @click="Add(number,$event)">点击此处,数字(+1)</view>
</view>
</template>
<script>
export default {
data() {
return {
number:0,
number2:""
};
},
methods:{
Add(number,event){
this.number = number + 1
// 获取标签中的自定义数据(data-number2)
this.number2 = event.currentTarget.dataset.number2
}
}
}
</script>
<style lang="scss">
</style>
组件
基本使用流程
定义
1.在项目根目录下新建文件夹components来统一管理组件
2.在components目录下新建组件*.vue
示例代码
<template>
<img class="head" src="../static/5799c80de4900.jpg" alt="">
</template>
<script>
export default {
name:"head-img",
data() {
return {
};
}
}
</script>
<style lang="scss">
.head{
/* 椭圆形头像样式 */
border-radius: 50%;
}
</style>
引入
# 在页面中引入组件
import 组件名 from 组件路径
代码示例:
<script>
// 这里的名字必须是驼峰体
import headImg from "../../components/head-img.vue"
</script>
注册
1.在页面中的实例中,新增属性components
2.属性components是一个对象,把组件放进对象中注册
3.uniapp推荐组件表明名为 带 -符号的标签,但是导入和注册的时候必须是divRed这种驼峰体
代码示例:
<script>
export default {
// 注册组件
components:{
headImg
}
}
</script>
使用
# 创建 组件名 的标签,如:
<组件名></组件名> # 即可使用该组件
代码示例:
<template>
<view class="content">
<!-- 使用组件,推荐使用 带`-`的组件标签名来使用,如divRed,可写成div-red,但是导入和注册的时候必须是divRed -->
<head-img></head-img>
</view>
</template>
组件传参
父向子传参,通过属性方式
父组件
<template>
<view class="content">
<!-- 同一个组件,根据传递的参数不同,显示不同的图片 -->
<!-- 随意定义一个属性,并将此属性和data中的数据动态绑定 -->
<head-img :mysrc="src1"></head-img>
<head-img :mysrc="src2"></head-img>
</view>
</template>
<script>
import headImg from "../../components/head-img.vue"
export default {
data() {
return {
// 声明变量,将来会通过:mysrc="src1"来显示src1的图片,:mysrc="src2"来显示src2的图片
src1:"../static/5799c80de4900.jpg",
src2:"../static/logo.png"
};
},
components:{
headImg
}
}
</script>
<style lang="scss">
</style>
子组件
<template>
<!-- 将src属性,与父组件传递过来的属性动态绑定 -->
<img class="head" :src="mysrc" alt="">
</template>
<script>
export default {
// 声明从父组件传递过来的属性
props:{
// 这个属性key必须和父组件传过来的属性key保持一致,并声明其类型
mysrc:String
},
name:"head-img",
data() {
return {
};
}
}
</script>
<style lang="scss">
.head{
border-radius: 50%;
}
</style>
子向父传参,通过触发事件方式
# 子组件通过出发时间的方式向父组件传递数据
# 父组件通过监听事件的方式来接收数据
子组件代码
<template>
<img @click="clickImg" class="head" :src="mysrc" alt="">
</template>
<script>
export default {
// 声明从父组件传递过来的属性
props:{
mysrc:String
},
name:"head-img",
data() {
return {
};
},
methods:{
// 绑定事件,将图片路径传递到父组件中
clickImg(){
// this.$emit("自定义的时间名称","要传递的参数")
this.$emit("srcChange",this.mysrc)
}
}
}
</script>
<style lang="scss">
.head{
border-radius: 50%;
}
</style>
父组件代码
<template>
<view class="content">
<view class="">
子组件传来的src路径参数为:{{src_image}}
</view>
<!-- @srcChange,为子组件定义的点击事件函数名 -->
<head-img @srcChange=handlerSrcChange :mysrc="src1"></head-img>
<head-img @srcChange=handlerSrcChange :mysrc="src2"></head-img>
</view>
</template>
<script>
import headImg from "../../components/head-img.vue"
export default {
data() {
return {
src_image:"",
src1:"../static/5799c80de4900.jpg",
src2:"../static/logo.png"
};
},
components:{
headImg
},
methods:{
// 父组件通过监听handlerSrcChange,来得到子组件传递过来的参数
handlerSrcChange(src_url){
this.src_image = src_url
}
}
}
</script>
<style lang="scss">
</style>
使用全局共享数据传递参数
1.通过挂载vue的原型上
<script>
// 设置变量或函数
// Vue.prototype是固定写法,.baseURL为设置的属性,Vue为全局对象,伴随vue的整个生命周期
Vue.prototype.baseURL="http://www.baidu.com"
</script>
main.js
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
Vue.prototype.baseURL = "http://www.baiducom"
home.vue
<template>
<view class="content">
<view class="">
{{src3}}
</view>
</view>
</template>
<script>
import headImg from "../../components/head-img.vue"
export default {
data() {
return {
src3:""
};
},
// onLoad中取值
onLoad() {
this.src3=this.baseURL
}
}
</script>
2.通过globalData的方式
app.vue
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
},
// 设置全局数据
globalData:{
basURL2:"http://www.taobao.com"
}
}
</script>
<style>
/*每个页面公共css */
</style>
home.vue
<template>
<view class="content">
{{src4}}
</view>
</view>
</template>
<script>
export default {
data() {
return {
src4:""
};
},
// 在onLoad中取值
onLoad() {
// golobaData取值
this.src4 = getApp().globalData.baseURL2
}
}
</script>
<style lang="scss">
</style>
3.store
store/index.js
//引入Vue 和 Vuex
import 'Vue' from 'vue'
import 'Vuex' from 'vuex'
// 使用Vuex
Vue.use(Vuex)
// 创建store 对象
const store = new Vuex.Store({
//state中是需要管理的全局变量
state:{
userName:'',
hasLogin:false
},
//mutations 是操作state中变量的方法
mutations:{
login(state,name){ //登录成功修改 全局变量
state.userName= name;
state.hasLogin= true;
},
loginOut(state){ //退出登录修改 全局变量
state.userName= '';
state.hasLogin= false;
}
}
})
// 导出store
export default store
main.js
// 注册Vuex
import 'store' form './store'
Vue.prototype.$store = store
// 找到app对象,在app对象中挂载store
const app = new Vue({
store,
...App
})
调用
this.$store.userName
组件插槽
标签也是数据中的一种,可以用组件插槽(slot),来实现父组件向子组件传递标签
通过 slot 来实现占位符
父组件
<template>
<view class="content">
<!-- 使用子组件 -->
<head-img @srcChange=handlerSrcChange :mysrc="src1">
<!-- 在子组件内,新增想要传递的标签 -->
<view class="">
账号: <input type="text">
</view>
</head-img>
</view>
</template>
子组件
<template>
<view class="">
<img @click="clickImg" class="head" :src="mysrc" alt="">
<!-- 添加slot占位符标签,渲染的时候会将父组件标签渲染在slot标签的位置 -->
<slot></slot>
</view>
</template>
生命周期
uniapp框架的生命周期是结合了vue和微信小程序的生命周期
全局APP的生命周期对象
onLaunch
应用启动时自动执行
onShow
应用第一次被看到时自动执行
onHide
应用后台运行时自动执行
页面的生命周期对象
onLoad
页面加载完毕后自动执行
onShow
页面被看到时自动执行
组件的生命周期对象
mounted
组件挂载完毕时自动执行
猜你喜欢
- 2025-08-02 Three.js + tensorflow.js构建实时人脸点云
- 2025-05-10 19年前司机被沉尸水库!凶手落网,竟已是身家千万的大老板
- 2025-05-10 常见跨域解决方案(一)(解决跨域的几种方法)
- 2025-05-10 生态文明建设四年巡礼 〉浦城:“三大创新”集成叠加 绿色发展再开新局
- 2025-05-10 福建推进河(湖)长制工作:当好“施工队长”建设八闽幸福河湖
- 2025-05-10 满意在三明 | 三明站附近变美啦,你发现了吗
- 2025-05-10 前端使用FileReader 读取本地文件和校验文件唯一
- 2025-05-10 这是一道“送命题”...辅导孩子写作业,45岁男子被气出脑出血
- 2025-05-10 深入理解Android NDK日志符号化(android日志在什么位置)
- 2025-05-10 中年大叔学编程-微信小程序展示金山词霸每日一句
- 08-02C|在一个结构体嵌套一个共用体实现一体多用
- 08-02C++中,常用的强制类型转换函数
- 08-02如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 08-02C++20 新特性(24):模板访问权限和typename的放宽
- 08-02C++零基础到工程实践
- 08-02[深度学习] Python人脸识别库face_recognition使用教程
- 08-02AI算法之怎么利用Python实现支持向量机SVM算法
- 08-02【机器学习】SVM支持向量机
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 623℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 526℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 491℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 460℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)