1. 程式人生 > >wepy學習基礎指令

wepy學習基礎指令

wepy學習基礎

1、引入樣式(以app.wpy為例)

在src目錄下建立資料夾styles/base.css

在這裡插入圖片描述

在app.wpy中引入base.css樣式

在這裡插入圖片描述

2、less提取css樣式

<style lang="less">
@color: red;
page {
	background-color: aqua;
	color: @color;
}
</style>

3、data和method的寫法

在這裡插入圖片描述

  • 注意:事件繫結語法使用優化語法代替。
1.原 bindtap="click" 替換為 @tap="click",
  原catchtap="click"替換為@tap.stop="click"。

2.原 capture-bind:tap="click" 替換為 @tap.capture="click",
  原capture-catch:tap="click"替換為@tap.capture.stop="click"。
  • setData繫結資料的變更:
 setData({msg1:”wepy”}) <==> this.msg1=”mywepy”;

需注意的是,在非同步函式中更新資料的時候,必須手動呼叫$apply方法,才會觸發髒資料檢查流程的執行。如:

setTimeout(() => {
    this.title = 'this is title';
    this.$apply();
}, 

4、計算屬性computed

在data中這種變數male值為false
在computed中計算 male1和male2的值
在view中顯示
在這裡插入圖片描述

<view>
	{{male}}:{{male1}}:{{male2}}
</view>

結果為:

在這裡插入圖片描述

5、監控屬性watch

監控data中某個資料變化時,觸發事件

例如:

data = {
	msg1: 'wepy',
	person1: {
		name: '張三',
		age: '18'
	},
	male: false
};

監控person1資訊變化:

watch={
	person1(newValue,oldValue){
		this.person1.name="李四"
		console.log(newValue,oldValue);
	}
};

結果顯示
在這裡插入圖片描述

注意:能用computed儘量不用watch,防止破壞資料初始完整性

6、自定義屬性和自定義函式(不能使用與檢視,普通自定義方法不能放在methods物件中)

在data和methods平行節點下

onLoad() {
	console.log('onLoad');
	this.showMyData();
};
//自定義屬性
myData = '我是自定義屬性';
// 自定義函式
showMyData() {
	console.log(this.myData);
}

在這裡插入圖片描述

7、自定義元件

  • src目錄下建立components資料夾
  • components下建立自定義元件頁面xxx.wpy,繼承wepy.component

在這裡插入圖片描述

注意:類名保持一致

  • 在script節點下引入自定義元件
import MyHeader from '../components/MyHeader';
import MyFooter from '../components/MyFooter';
  • Export default節點下宣告自定義元件
components = {
	MyHeader,
	MyFooter
};
  • 使用自定義元件
<template>
	<MyHeader></MyHeader>
	<MyFooter></MyFooter>
</template>

8、增加頁面

在app.wpy配置頁面config配置中

pages: ['pages/index2','pages/index'],

9、props傳值

  • 靜態傳值

靜態傳值為父元件向子元件傳遞常量資料,因此只能傳遞String字串型別。
模擬資料(宣告資料msg1)

data = {
	msg1: '父元件的資料'
};

傳遞資料

<MyHeader :msg1="msg1"></MyHeader>

注意:":"不能省略

接收資料

在子元件export default中宣告接收

props = {
	msg1: String
};

使用資料

<view class="myHeader">
	<!-- 自己的頭部自定義元件:{{name}} -->
	{{msg1}}
</view>
  • 動態傳值,單向繫結

使用sync,只需要在父元件傳遞資料時新增sync即可實現,子元件的資料隨著父元件變化而變化

<MyHeader :msg1.sync="msg1"></MyHeader>
  • 動態傳值雙向繫結

使用sync 和twoWay,只需要在父元件傳遞資料時新增sync即可實現,子元件新增twoWay:true

父元件

	<!-- 動態傳值,單向繫結的方式1 sync 2 .twoWay:true-->
	<MyHeader :msg1.sync="msg1"></MyHeader>

子元件

props = {
	msg1: {
		type:String,
		twoWay:true
	}
};

10、父子通訊$broadcast(實現父事件對子事件的呼叫)

  • 建立子元件Cat、Dog
<style lang="less" scoped>
.myHeader {
	font-size: 30rpx;
}
</style>
<template>
	<view class="myHeader">
		{{msg}}
	</view>
</template>
<script>
import wepy from 'wepy';
export default class Cat extends wepy.component {
	data = {
		msg: ''
	};
	events = {
		say() {
			console.log('貓叫');
			this.msg = '貓叫';
		}
	};
}
</script>
  • 父元件呼叫
<style lang="less">
page {
	font-size: 50rpx;
}
</style>
<template>
	<view>
		<view @tap="myTap">{{msg}}</view>
			<Cat></Cat>
			<Dog></Dog>
		</view>
</template>

<script>
import wepy from 'wepy';
import Cat from '../components/Cat';
import Dog from '../components/Dog';
export default class Index3 extends wepy.page {
	config = {
		navigationBarTitleText: '自定義元件',
		navigationBarTextStyle: 'white'
	};
	data = {
		msg: '點選觸發子元件say事件'
	};
	components = {
		Cat,
		Dog
	};
	methods = {
		myTap() {
			//開始觸發元件的方法、廣播
			//this.$broadcast("子元件的事件名",...引數物件);
			this.$broadcast('say', null);
		}
	};
}
</script>

主要使用的是父元件$broadcast,和子元件events

11、子元件向父元件通訊$emit

  • 建立子元件SonA、SonB
<style lang="less" scoped>
.myHeader {
	font-size: 30rpx;
}
</style>
<template>
	<view
	class="myHeader"
	@tap="aTap"
	>
		點選SonA
	</view>
</template>
<script>
import wepy from 'wepy';
export default class SonA extends wepy.component {
	data = {
		msg: ''
	};
	methods = {
		aTap() {
			//觸發父元件的方法 $emit
			this.$emit('showMsg', 'sonA');
		}
	};
}
</script>
  • 父元件呼叫
<style lang="less">
page {
	font-size: 50rpx;
}
</style>
<template>
	<view>
		<view>{{msg}}</view>
		<!-- 
		引入兩個元件 SonA、SonB
		SonA觸發事件,帶上引數
		SonB觸發事件,帶上引數
		-->
		<SonA></SonA>
		<SonB></SonB>
	</view>
</template>

<script>
import wepy from 'wepy';
import SonA from '../components/SonA';
import SonB from '../components/SonB';
export default class Index4 extends wepy.page {
	config = {
		navigationBarTitleText: '自定義元件',
		navigationBarTextStyle: 'white'
	};
	data = {
		msg: ''
	};
	components = {
		SonA,
		SonB
	};
	events = {
		showMsg(source) {
			this.msg = source + '傳遞進來的';
		}
	};
}
</script>

子元件使用$emit進行觸發父元件的事件,父元件使用events進行接收(自定義事件和&emit結合使用父元件不用再使用events進行接收,直接執行自定義事件

12、平行元件之間的通訊$invoke

  • 父元件
<style lang="less">
page {
	font-size: 50rpx;
}
</style>
<template>
	<view>
		<A></A>
		<B></B>
	</view>
</template>

<script>
import wepy from 'wepy';
import A from '../components/A';
import B from '../components/B';
export default class Index5 extends wepy.page {
	config = {
		navigationBarTitleText: '自定義元件',
		navigationBarTextStyle: 'white'
	};
	components = {
		A,
		B
	};
}
</script>
  • A元件
<style lang="less" scoped>
.myHeader {
	font-size: 30rpx;
}
</style>
<template>
	<view
	class="myHeader"
	@tap='myTap'
	>
		A:
	</view>
</template>
<script>
import wepy from 'wepy';
import B from './B';
export default class A extends wepy.component {
	data = {
		msg: ''
	};
	methods = {
		myTap() {
			//直接呼叫b元件中的方法 show
			// this.$invoke("要呼叫的元件的路徑","方法名",引數)
			this.$invoke('B', 'show', '------A的傳參');
		}
	};
	components={
		B
	}
}
</script>

  • B元件
<style lang="less" scoped>
.myHeader {
	font-size: 30rpx;
}
</style>
<template>
	<view class="myHeader">
		B:{{msg1}}
	</view>
</template>
<script>
import wepy from 'wepy';
export default class B extends wepy.component {
	data = {
		msg1: ''
	};
	methods = {
		show(arg1) {
			console.log('接收A元件的資料' + arg1);
		}
	};

}
</script>

注意:A子元件要呼叫B子元件的事件,必須引入B元件

13、元件自定義事件處理函式(@tap.default,@tap.stop)

  • .default: 繫結小程式冒泡型事件,如bindtap,.default字尾可省略不寫;

  • .stop: 繫結小程式捕獲型事件,如catchtap;

  • .user: 繫結使用者自定義元件事件,通過$emit觸發。注意,如果用了自定義事件,則events中對應的監聽函式不會再執行。

注意:default是預設的冒泡事件,可以不寫;
	 stop是阻斷冒泡事件,但是注意父元件事件名稱不可以和子元件的事件名稱一樣,否則事件不會阻斷;
	 自定義事件 例如:@childFn.user="parentFn"(和&emit結合使用父元件不用再使用events進行接收,直接執行自定義事件)

14、插槽

  • 單個插槽直接進行使用即可

    面板子元件panel

	<view class="panel"> 
		<slot ></slot>
 	</view>

父元件引用

<panel> 
	<view >插入新檢視</view>
</panel>
  • 多個插槽需要進行命名

    面板子元件panel

<view class="panel"> 
	<slot name="title"></slot>
 	<slot name="content"></slot>
 </view>

父元件引用需要進行對應

 <panel>
 	<view slot="title">標題</view>
 	<view slot="content"> <text>內容</text> </view>
 </panel>

15、攔截器

詳細檢視文件https://tencent.github.io/wepy/document.html#/?id=_1-wxrequest-%e6%8e%a5%e6%94%b6%e5%8f%82%e6%95%b0%e4%bf%ae%e6%94%b9

16、迴圈標籤repeat

類似也mina框架中的block 當需要迴圈渲染Wepy元件時,必須使用Wepy定義的輔助標籤預設項為item 索引為 index

<!-- 注意,使用for屬性,而不是使用wx:for屬性 --> 
	<repeat for="{{list}}" key="index" index="index" item="item"> 
		<!-- 插入<script>指令碼部分所宣告的child元件,同時傳入item --> 
		<child :item="item"></child> 
</repeat>