移动平台UniAPP学习记录
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。
<template>
<view>
<view>
数据学习
view>
<view>{{msg}}view>
<view>{{1?'对':'错'}}view>
<view>{{1+1}}view>
<image v-bind:src="imgUrl">image>
<image :src="imgUrl">image>
view>
template>
<script>
export default {
data() {
return {
msg:'hello',
imgUrl :'sdadadasda'
}
},
methods: {
}
}
script>
<style>
style>
<template>
<view>
<view v-for="(item,index) in 10">
<view :class="'list-' + index%2">{{index%2}}view>
view>
view>
template>
<script>
export default {
data() {
return { }
}
}
script>
<style>
.list-0{
background-color: #aaaaff;
}
.list-1{
background-color: #ffaa7f;
}
style>
指令是带有 v- 前缀的特殊属性。
data 必须声明为返回一个初始数据对象的函数(注意函数内返回的数据对象不要直接引用函数外的对象);否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据。
//正确用法,使用函数返回对象
data() {
return {
title: 'Hello'
}
}
//错误写法,会导致再次打开页面时,显示上次数据
data: {
title: 'Hello'
}
//错误写法,同样会导致多个组件实例对象数据相互影响
const obj = {
title: 'Hello'
}
data() {
return {
obj
}
}
<template>
<view>
<view>Original message: "{{ message }}"view>
<view>Computed reversed message: "{{ reversedMessage }}"view>
view>
template>
<script>
export default {
data() {
return {
message: 'Hello'
}
},
computed: {
// 计算属性的 getter
reversedMessage(){
return this.message.split('').reverse().join('')
}
}
}
script>
结果:
Original message: "Hello"
Computed reversed message: "olleH"
<template>
<view>
<view>{{ fullName }}view>
view>
template>
<script>
export default {
data() {
return {
firstName: 'Foo',
lastName: 'Bar'
}
},
computed: {
fullName: {
// getter
get(){
return this.firstName + ' ' + this.lastName
},
// setter
set(newValue){
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
}
script>
运行 fullName = ‘John Doe’ 时,setter 会被调用,firstName 和 lastName 也会相应地被更新。
Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch 。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。
<template>
<view>
<input type="text" v-model="word">
view>
template>
<script>
export default {
data() {
return {
word: 'word'
}
},
watch: {
// 使用watch来响应数据的变化
word(newVal, oldVal) {
console.log('最新值是:'+newVal,"原来的值是:"+ oldVal);
}
},
}
script>
<script>
export default {
data() {
return {
a: 1,
b: 2,
c: 3,
d: 4,
e: {
f: {
g: 5
}
}
}
},
watch: {
a: function(val, oldVal) {
console.log('new: %s, old: %s', val, oldVal)
},
// 方法名
b: 'someMethod',
// 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
c: {
handler: function(val, oldVal) { /* ... */ },
deep: true
},
// 该回调将会在侦听开始之后被立即调用
d: {
handler: 'someMethod',
immediate: true
},
// 你可以传入回调数组,它们会被逐一调用
e: [
'handle1',
function handle2(val, oldVal) { /* ... */ },
{
handler: function handle3(val, oldVal) { /* ... */ },
/* ... */
}
],
// watch vm.e.f's value: {g: 5}
'e.f': function(val, oldVal) { /* ... */ }
}
}
script>
可以传给 v-bind:class 一个对象,实现动态地切换 class。
也可以在对象中传入更多字段来动态切换多个 class。此外,v-bind:class 指令也可以与普通的 class 共存。
<template>
<view>
<view class="static" :class="{ active: isActive}">111view>
<view class="static" :class="{ active: isActive, 'text-danger': hasError }">222view>
<view v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">333view>
view>
template>
<script>
export default {
data() {
return {
isActive: true,
hasError: false,
activeColor:"green",
fontSize:50
}
}
}
script>
<style>
.static{
color: #2C405A;
}
.active{
background-color: #007AFF;
}
.text-danger{
color: #DD524D;
}
style>
渲染结果
<view class="static active">view>
可以把一个数组传给 v-bind:class,以应用一个 class 列表。
<template>
<view>
<view class="static" :class="[activeClass,errorClass]">111view>
<view class="static" v-bind:class="[isActive ? activeClass : '', errorClass]">222view>
<view class="static" v-bind:class="[{ active: isActive }, errorClass]">333view>
<view v-bind:style="[{ color: activeColor, fontSize: fontSize + 'px' }]">444view>
view>
template>
<script>
export default {
data() {
return {
isActive: true,
activeClass: 'active',
errorClass: 'text-danger',
activeColor:"green",
fontSize:50
}
}
}
script>
<style>
.static{
font-size:30rpx;
}
.active{
background-color: #007AFF;
}
.text-danger{
font-size:60rpx;
color:#DD524D;
}
style>
注意:以:style=""这样的方式设置px像素值,其值为实际像素,不会被编译器转换。
此外还可以用 computed 方法生成 class 或者 style 字符串,插入到页面中,举例说明:
<template>
<view class="container" :class="computedClassStr">view>
<view class="container" :class="{active: isActive}">view>
<view class="container" :class="computedClassObject">view>
template>
<script>
export default {
data () {
return {
isActive: true
}
},
computed: {
computedClassStr () {
return this.isActive ? 'active' : ''
},
computedClassObject () {
return { active: this.isActive }
}
}
}
script>
"tabBar": {
"color": "#7A7E83",
"selectedColor": "#3cc51f",
"borderStyle": "black",
"backgroundColor": "#ffffff",
//"position": "top",
"list": [{
"pagePath": "pages/index/index",
"iconPath": "static/tabs/home.png",
"selectedIconPath": "static/tabs/home-active.png",
"text": "主页"
}, {
"pagePath": "pages/message/message",
"iconPath": "static/tabs/message.png",
"selectedIconPath": "static/tabs/message-active.png",
"text": "信息"
}, {
"pagePath": "pages/contact/contact",
"iconPath": "static/tabs/contact.png",
"selectedIconPath": "static/tabs/contact-active.png",
"text": "联系"
}]
}