源码可以提供下载,详情访问末尾码云地址
新建模板项目hello uniapp
复制模板common下的css
在本项目的app.vue进行引入css文件 @import “./common/uni.css ” (还要引入uni.tff文件,否则报错)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xizHMjdI-1649380676444)(uniapp社区交友开发.assets/image-20220322164136184-16479384973031.png)]
阿里巴巴矢量图标库 https://www.iconfont.cn/
下载所选图标至项目打包 得到压缩文件
修改icon.css文件去掉url,引入文件 测试图标使用
下载animate.css
引入animate.css
测试css动画库的使用
点击效果
解析page.json文件 看官方文档
设置导航栏的样式
"globalStyle": {
"navigationBarTextStyle": "black", //导航栏字体颜色
"navigationBarTitleText": "社区交友",//导航栏文字
"navigationBarBackgroundColor": "#FFF",//背景颜色
"backgroundColor": "#FFF"
}
设置图标(图片为png,81*81)用矢量图标库下载
配置tabBar前提要配置pages数组页面
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
}
}
,{
"path" : "pages/news/news",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/msg/msg",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/my/my",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
],
"tabBar": {
"color": "#323232",
"selectedColor": "#FC5C82",
"backgroundColor": "#FFF",
"borderStyle": "black",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/tabbar/index.png",
"selectedIconPath": "static/tabbar/indexed.png"
},
{
"pagePath": "pages/news/news",
"text": "动态",
"iconPath": "static/tabbar/news.png",
"selectedIconPath": "static/tabbar/newsed.png"
},
{
"pagePath": "pages/msg/msg",
"text": "消息",
"iconPath": "static/tabbar/paper.png",
"selectedIconPath": "static/tabbar/papered.png"
},
{
"pagePath": "pages/my/my",
"text": "我的",
"iconPath": "static/tabbar/home.png",
"selectedIconPath": "static/tabbar/homeed.png"
}
]
}
普通的选择器 id就用#,class就用.,什么都不加默认全部
父级下的子级菜单的选择器
.box>view:first-of-type{
background-color: red;
}
.box>view:last-of-type{
background-color: pink;
}
.box>view:nth-child(2){
background-color: yellow;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvOmDgZ5-1649380676446)(uniapp社区交友开发.assets/image-20220323110150462-16480045116861.png)]
奇偶选择器
//奇数选择器
.box>view:nth-of-type(odd){
background-color: red;
}
//偶数选择器
.box>view:nth-of-type(even){
background-color: green;
}
//偶数选择器
.box:nth-of-type(even){
background-color: green;
}
watch
测试
{{num}}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gyz1MrF9-1649380676447)(uniapp社区交友开发.assets/image-20220323154220758-16480213421241.png)]
常用于数据的格式化
computed
测试运用
{{formatWeight}}
导航栏配置根据官方文档配置
{
"path": "pages/index/index",
"style": {
"app-plus": {
// 导航栏配置
"titleNView":{
// 搜索框配置
"searchInput":{
"align":"center",
"backgroundColor":"#F5F4F2",
"borderRadius":"4px",
"disabled":true,
"placeholder":"搜索帖子",
"placeholderColor":"#6D6C67"
},
"buttons":[
{
"color":"#333333",
"colorPressed":"#FD597C",
"float":"right",
"fontSize":"20px",
"fontSrc":"/static/iconfont.ttf",
"text":"\ue668"
}
]
}
}
}
}
用真机调试成功,微信开发者工具旁边无显示
封装free.css把常用样式封装 如==flex:display;justify-content:center;algin-items:center、
引入自定义css库
列表开发
昵称
2022-3-15
关注
哈哈哈
赞
踩
评论
转发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daoAQo1N-1649380676447)(uniapp社区交友开发.assets/image-20220323193232107.png)]
继续使用free.css封装代码
昵称
2022-3-15
关注
我是标题
赞
踩
评论
转发
封装本项目公共css(common.css 记得引入)
.bg-main{
background: #FF4A6A;
}
封装成组件动态渲染
import commonList from '@/components/common/common-list';
components:{
commonList
},
{{item.username}}
{{item.newstime}}
关注
{{item.title}}
{{item.support.support_count}}
{{item.support.unsupport_count}}
{{item.comment_count}}
{{item.share_num}}
export default{
props:{
item:Object,
key:Number
}
}
封装组件divider.vue
引入全局组件(分割线常用)
import divider from '@/components/common/divider.vue';
Vue.component('divider',divider);
<block v-for="(item,index) in list" :key="index">
<commonList :item="item" :index="index"></commonList>
<divider></divider>
</block>
{{item.username}}
{{item.newstime}}
关注
{{item.title}}
{{item.support.support_count}}
{{item.support.unsupport_count}}
{{item.comment_count}}
{{item.share_num}}
关注
follow(){
// 触发父级follow方法
this.$emit('follow',this.index);
},
methods: {
follow(index){
this.list[index].isFollow=true;
uni.showToast({
title:'关注成功'
})
}
}
{{item.support.support_count>0?item.support.support_count:'支持'}}
doSupport(type){
this.$emit('doSupport',{
type:type,
index:this.index
})
}
doSupport(e) {
let obj=this.newList[this.tabIndex].list[e.index]
console.log(obj);
if (obj.support.type === '') {
//无操作
obj.support[e.type + '_count']++;
} else if (obj.support.type === 'support' && e.type === 'unsupport') {
//之前是顶,顶减一,踩加一
obj.support.support_count--;
obj.support.unsupport_count++;
} else if (obj.support.type === 'unsupport' && e.type === 'support') {
//之前是踩,顶加一,踩减一
obj.support.support_count++;
obj.support.unsupport_count--;
}
obj.support.type = e.type;
let msg = e.type === 'support' ? '顶' : '踩';
uni.showToast({
title: msg + '成功'
})
},
顶部导航选项卡
{{item.name}}
tabIndex:0,
scrollInto:'',
tabBars:[
{
name:'首页'
},
{
name:'体育'
},
{
name:'军事'
},
{
name:'热点'
},
{
name:'新闻'
},
{
name:'娱乐'
},
{
name:'电竞'
},
{
name:'国际'
},
{
name:'国家'
}
],
doTab(index){
this.tabIndex=index;
this.scrollInto='tab'+index;
}
下面容器能做到切换与导航栏一样,容器也能拉取
{{i}}
doTab(index){
this.tabIndex=index;
this.scrollInto='tab'+index;
},
onChange(e){
this.doTab(e.detail.current);
}
onLoad() {
const res = uni.getSystemInfoSync();
this.scrollH=res.windowHeight-uni.upx2px(101);
console.log(this.scrollH);
},
列表显示
getData(){
let arr=[];
for (var i = 0; i < this.tabBars.length; i++) {
arr.push({
list: [{
userPic: '/static/common//nothing.png',
username: '',
newstime: '',
isFollow: false,
title: '我是标题',
titlePic: '/static/demo/datapic/45.jpg',
support: {
type: 'support',
support_count: 1,
unsupport_count: 2
},
comment_count: 1,
share_num: 0
},
{
userPic: '/static/common//nothing.png',
username: '',
newstime: '',
isFollow: false,
title: '我是标题',
titlePic: '',
support: {
type: 'unsupport',
support_count: 2,
unsupport_count: 2
},
comment_count: 1,
share_num: 1
},
{
userPic: '/static/common//nothing.png',
username: '',
newstime: '',
isFollow: false,
title: '我是标题',
titlePic: '',
support: {
type: '',
support_count: 2,
unsupport_count: 2
},
comment_count: 1,
share_num: 1
}
]
})
};
this.newList=arr;
},
静态的开发
{{item.loading}}
触底函数的开发
loadMore(index){
let item=this.newList[index];
item.loading='加载中.';
setTimeout(()=>{
//复制文本
item.list=[...item.list,...item.list];
},2000)
}
优化加载判断
loadMore(index){
let item=this.newList[index];
if(!item==='上拉加载更多'){
return;
}
item.loading='加载中...';
setTimeout(()=>{
item.list=[...item.list,...item.list];
item.loading='上拉加载更多';
},10000)
}
封装load-more.vue 并引入
{{loading}}
import loadMore from '@/components/common/load-more';
export default {
components: {
commonList,
loadMore
},
}
无数据环境测试
const demo=[
{
userPic: '/static/common//nothing.png',
username: '',
newstime: '',
isFollow: false,
title: '我是标题',
titlePic: '/static/demo/datapic/45.jpg',
support: {
type: 'support',
support_count: 1,
unsupport_count: 2
},
comment_count: 1,
share_num: 0
},
{
userPic: '/static/common//nothing.png',
username: '',
newstime: '',
isFollow: false,
title: '我是标题',
titlePic: '/static/demo/datapic/45.jpg',
support: {
type: 'unsupport',
support_count: 2,
unsupport_count: 2
},
comment_count: 1,
share_num: 1
},
{
userPic: '/static/common//nothing.png',
username: '',
newstime: '',
isFollow: false,
title: '我是标题',
titlePic: '',
support: {
type: '',
support_count: 2,
unsupport_count: 2
},
comment_count: 1,
share_num: 1
}
]
getData() {
let arr = [];
for (var i = 0; i < this.tabBars.length; i++) {
let obj = {
loading:'上拉加载更多',
list: []
}
if(i<2){
obj.list=demo;
}
arr.push(obj)
};
this.newList = arr;
},
封装nothing.vue组件 全局引入
import noThing from '@/components/common/no-thing.vue';
Vue.component('no-thing',noThing);
创建页面search,配置pages.json
{
"path": "pages/index/index",
"style": {
"app-plus": {
// 导航栏配置
"titleNView":{
// 搜索框配置
"searchInput":{
"align":"center",
"backgroundColor":"#F5F4F2",
"borderRadius":"4px",
"disabled":true,
"placeholder":"搜索帖子",
"placeholderColor":"#6D6C67"
},
"buttons":[
{
"color":"#333333",
"colorPressed":"#FD597C",
"float":"right",
"fontSize":"20px",
"fontSrc":"/static/iconfont.ttf",
"text":"\ue668"
}
]
}
}
}
}
,{
"path" : "pages/news/news",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/msg/msg",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/my/my",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/search/search",
"style": {
"app-plus": {
// 导航栏配置
"titleNView":{
// 搜索框配置
"searchInput":{
"align":"center",
"backgroundColor":"#F5F4F2",
"borderRadius":"4px",
"placeholder":"搜索帖子",
"placeholderColor":"#6D6C67"
},
"buttons":[
{
"color":"#333333",
"colorPressed":"#FD597C",
"float":"right",
"fontSize":"14px",
"text":"搜索"
}
]
}
}
}
}
监听点击导航栏搜索框事件, 实现跳转,用官方api
onNavigationBarSearchInputClicked() {
uni.navigateTo({
url: '../search/search'
})
},
搜索历史开发
搜索历史
{{item}}
监听导航输入
onNavigationBarSearchInputChanged(e) {
this.searchText=e.text;
}
监听导航搜索按钮
onNavigationBarButtonTap(e) {
if(e.index===0){
this.searchEvent();
}
},
搜索事件, 收起键盘,处于loading状态, 展示搜索结果,隐藏loading提示框
searchEvent(){
uni.hideKeyboard();
uni.showLoading({
title:'加载中'
})
setTimeout(()=>{
this.serachList=demo;
uni.hideLoading();
},3000)
}
搜索结果列表 引入commonlist,遍历,优化搜索历史与列表存在问题
搜索历史
{{item}}
import commonList from '@/components/common/common-list.vue';
export default {
components:{
commonList
},
}
点击搜索历史的事件
{{item}}
historyEvent(item){
console.log(item);
this.searchText=item;
this.searchEvent();
}
新建发布页面add-input,取消原生导航
{
"path" : "pages/add-input/add-input",
"style" :
{
"app-plus": {
"titleNView": false
}
}
}
首页导航按钮跳转页面
onNavigationBarButtonTap() {
uni.navigateTo({
url:'../add-input/add-input'
})
},
自定义导航栏,添加uni-nav-bar依赖, 根据官方文档调用
所有人可见
utextarea, 动态绑定
发送
upload-image组件开发, 引官方组件,对应引入也需要引入
对官方组件的修改 添加mode压缩,修改内边距, 修改圆角
点击可预览选好的图片
{{imageList.length}}/9
上传图片成功的内容保存 上传图片的回调success方法中
success: (res) => {
this.imageList = this.imageList.concat(res.tempFilePaths);
this.$emit('choose',this.imageList);
},
choose(e){
console.log(e);
this.imageList=e;
}
静态图标的实现
添加删除功能的函数, 通知父组件, 优化父组件方法, 给予交互反馈提示
deleteImage(index){
uni.showModal({
title:'提示',
content:'是否要删除该图片',
confirmText:'删除',
cancelText:'不删除',
success: (res) => {
if(res.confirm){
this.imageList.splice(index,1);
this.$emit('change',this.imageList);
}
}
})
},
添加返回首页方法
所有人可见
goBack(){
uni.navigateBack({
delta:1
})
},
监听返回, 交互提示反馈 return true即能返回
onBackPress() {
if((this.content!==''||this.imageList.length>0)&&!this.showBack){
uni.showModal({
content: '是否保存为草稿',
showCancel: true,
cancelText: '不保存',
confirmText: '保存',
success: res => {
if(res.confirm){
console.log('保存');
}
//手动执行返回
// goBack(){
// uni.navigateBack({
// delta:1
// })
// },
this.goBack();
}
});
this.showBack=true;
return true;
}
},
保存的方法
store(){
let obj={
content:this.content,
imageList:this.imageList
};
uni.setStorage({
key:'add-input',
data:JSON.stringify(obj)
})
}
取出的方法 用同步取出
onLoad() {
var res=uni.getStorageSync('add-input');
if(res){
var obj=JSON.parse(res);
// console.log(result);
this.content=obj.content;
this.imageList=obj.imageList;
}
},
优化图片的草稿功能, 上传图片的组件imageList要用props传值
//组件里面
props: {
list: Array
},
created(){
this.imageList=this.list;
},
不保存草稿功能的实现, 清楚缓存
onBackPress() {
if((this.content!==''||this.imageList.length>0)&&!this.showBack){
uni.showModal({
content: '是否保存为草稿',
showCancel: true,
cancelText: '不保存',
confirmText: '保存',
success: res => {
if(res.confirm){
// console.log('保存');
this.store();
}else{
uni.removeStorageSync('add-input');
}
//手动执行返回
this.goBack();
}
});
this.showBack=true;
return true;
}
},
下面图标插入图片的方法(优化不需要上传图片时隐藏上传图片组件)
iconClickEvent(e){
switch (e){
case 'uploadImage': this.$refs.uploadImage.chooseImage();
break;
}
}
computed:{
show(){
return this.imageList.length>0;
}
},
在子组件中加入v-if=“show”
自定义导航栏的静态开发
关注
话题
取消原生导航栏
{
"path": "pages/news/news",
"style": {
"app-plus": {
"titleNView": false
}
}
},
导航栏右边图标的单击事件
关注
话题
openAddInput(){
uni.navigateTo({
url: '../add-input/add-input'
})
}
tabBar的动态循环渲染
{{item.name}}
data() {
return {
tabIndex:0,
tabBars:[
{
name:'关注'
},{
name:'话题'
}
]
}
},
changeTab(index){
this.tabIndex=index;
}
引入首页的swipper和scrollview组件, 对应修改即可
计算区域高度
onLoad() {
const res = uni.getSystemInfoSync();
this.scrollH=res.screenHeight-res.statusBarHeight-44;
console.log(this.scrollH);
},
有两个swipperitem 表示关注和话题
{{item}}
话题
引入common-list组件
分割线的使用
话题
导航与列表的联动实现
话题
onChangeTab(e){
// console.log(e.detail);
this.tabIndex=e.detail.current;
}
静态页面开发
热门分类
更多
关注
关注
关注
关注
添加点击动画效果
关注
热门分类对象数组构建
hotCate:[{
name:'关注'
},
{
name:'推荐'
},
{
name:'体育'
},
{
name:'军事'
}
]
封装组件, 导入组件,遍历输出, 父子传值
留两个接口
热门分类
更多
{{item.name}}
静态页面开发
搜索话题
静态页面开发
最近更新
话题哈哈哈
话题描述
今日:0
关注:0
声明topicList
topicList: [{
cover: '/static/demo/topicpic/1.jpeg',
title: '话题标题',
desc: '话题描述',
news_count: '10',
today_count: '10'
},
{
cover: '/static/demo/topicpic/1.jpeg',
title: '话题标题',
desc: '话题描述',
news_count: '10',
today_count: '10'
},
{
cover: '/static/demo/topicpic/1.jpeg',
title: '话题标题',
desc: '话题描述',
news_count: '10',
today_count: '10'
},
{
cover: '/static/demo/topicpic/1.jpeg',
title: '话题标题',
desc: '话题描述',
news_count: '10',
today_count: '10'
}
]
封装组件,引入组件
{{item.title}}
{{item.desc}}
动态:{{item.news_count}}
今日:{{item.today_count}}
新建页面
{
"path" : "pages/topic-nav/topic-nav",
"style" :
{
"navigationBarTitleText": "话题分类"
}
}
导航进入
openMore(){
uni.navigateTo({
url:'../topic-nav/topic-nav'
})
},
引入首页,修改topic—nav页面,修改common-list组件, 修改数据
{{item.name}}
新建topic-detail页面
配置导航栏, 渐变式透明, 图标
{
"path" : "pages/topic-detail/topic-detail",
"style" :
{
"navigationBarTitleText": "",
"app-plus": {
"titleNView": {
"type": "transparent",
"buttons": [
{
"type": "menu"
}
]
}
}
}
}
导航到话题详情页, 传递json字符串对象, 接受数据转换object
openDetail(item){
uni.navigateTo({
url:'../topic-detail/topic-detail?detail='+JSON.stringify(item)
})
}
onLoad(e){
if(e.detail){
var obj=JSON.parse(e.detail);
// console.log(obj);
}
},
图片模糊状态
静态开发
#话题标题#
动态:0
今日:0
话题描述
新建topic-info组件
动态替换, 数据渲染
{{info.title}}
动态:{{info.news_count}}
今日:{{info.today_count}}
{{info.desc}}
【新人必读】uni-app实战项目第四季社区交友开发
【新人必读】uni-app实战项目第四季社区交友开发
优化精华帖子列表开发, 用循环
{{item.title}}
hotList: [{
title: '【新人必读】uni-app实战项目第四季社区交友开发'
},
{
title: '【新人必读】Hillky社区规范'
}
]
tab选项开发
默认
最新
列表开发, 引入公共列表, 声明两个数组list1,2
tab切换实现
{{item.name}}
tabIndex: 0,
tabBar:[
{
name:'默认'
},
{
name:'最新'
}
]
用计算属性切换数组
computed: {
listData() {
if (this.tabIndex === 0) {
return this.list1;
}
if (this.tabIndex === 1) {
return this.list2;
}
}
},
遍历列表要分割线
判断数组长度, 用nothing组件
触底事件
onReachBottom() {
this.loadMore();
},
引入上拉加载组件
import loadMore from '@/components/common/load-more';
loadText计算属性区分是哪个列表的上拉加载
loadText1:'上拉加载更多',
loadText2:'上拉加载更多'
loadText(){
if(this.tabIndex===0){
return this.loadText1
}else{
return this.loadText2
}
}
上拉加载更多事件
loadMore(){
let index =this.tabIndex
if(this['loadText'+(index+1)]!=='上拉加载更多'){
return;
}
this['loadText'+(index+1)]='加载中...'
setTimeout(()=>{
this['loadText'+(index+1)]='上拉加载更多';
this['list'+(index+1)]=[...this['list'+(index+1)],...this['list'+(index+1)]];
},2000)
}
配置顶部导航栏, 配置左右图标
{
"path": "pages/msg/msg",
"style": {
"navigationBarTitleText": "消息列表",
"app-plus": {
"titleNView": {
"buttons": [
{
"color": "#333333",
"colorPressed": "#FD597C",
"float": "left",
"fontSize": "20px",
"fontSrc": "/static/iconfont.ttf",
"text": "\ue611"
},
{
"color": "#333333",
"colorPressed": "#FD597C",
"float": "right",
"fontSize": "20px",
"fontSrc": "/static/iconfont.ttf",
"text": "\ue649"
}
]
}
}
}
静态开发
引入数字脚标组件
昵称
17:00
内容
优化内容, 添加对应css和最大宽度
内容内容内容内容内容内容内容内容内容内容内容内容内容
封装数据,封装组件, 时间使用在线时间戳
引入time.js, 使用对应库,使用过滤器
import $T from '@/common/time.js'
filters:{
formatTime(value){
return $T.gettime(value);
}
},
组件分离
{{item.username}}
{{item.update_time | formatTime}}
{{item.data}}
page.json配置
"enablePullDownRefresh": true,
监听下拉刷新, 写入方法
onPullDownRefresh() {
this.refresh();
},
refresh(){
setTimeout(()=>{
this.list=demo;
uni.stopPullDownRefresh();
},2000);
}
引入nothing组件, v-if判断
使用uni-poup组件,
监听原生导航栏按钮事件,弹出弹出层
123
onNavigationBarButtonTap(e) {
switch (e.index){
case 0:
break;
case 1:
this.$refs.popup.open();
break;
}
},
静态开发
添加点击事件
搜索好友
删除列表
popupEvent(event){
switch (event){
case 'findFriend':
{
console.log('findFriend');
this.$refs.popup.close();
break;
}
case 'deleteList':
{
console.log('deleteList');
this.$refs.popup.close();
break;
}
}
}
新建user-list, 导航进入该页面
onNavigationBarButtonTap(e) {
switch (e.index){
case 0:
uni.navigateTo({
url:'../user-list/user-list'
})
break;
case 1:
this.$refs.popup.open();
break;
}
},
配置page.json
{
"path": "pages/user-list/user-list",
"style": {
"navigationBarTitleText": "",
"app-plus": {
"animationType": "slide-in-left",
"titleNView": {
"autoBackButton": true,
"searchInput": {
"align": "center",
"backgroundColor": "#F5F4F2",
"borderRadius": "4px",
"disabled": true,
"placeholder": "搜索用户",
"placeholderColor": "#6D6C67"
},
"buttons": [{
"color": "#333333",
"colorPressed": "#FD597C",
"float": "right",
"fontSize": "14px",
"text": "取消"
}]
}
}
}
监听点击输入框事件, 监听取消按钮事件
onNavigationBarSearchInputClicked() {
// console.log('跳转');
uni.navigateTo({
url:'../search/search'
})
},
onNavigationBarButtonTap() {
uni.navigateBack({
delta: 1
})
},
引入tabBar导航
条件渲染数字
{{item.name}} {{item.num}}
引入首页的scrollview, 下拉, 对应修改和引入
列表样式静态开发
昵称
性别
getData() {
let arr = [];
for (var i = 0; i < this.tabBars.length; i++) {
let obj = {
loading: '上拉加载更多',
list: []
}
if (i < 2) {
obj.list = [1,2,3,4];
}
arr.push(obj)
};
this.newList = arr;
},
changeTab(index){
this.tabIndex=index;
},
onChange(e){
this.changeTab(e.detail.current);
},
loadMore(index) {
let item = this.newList[index];
if ((item.loading) !== '上拉加载更多') {
return;
}
item.loading = '加载中...';
setTimeout(() => {
item.list = [...item.list, ...item.list];
item.loading = '上拉加载更多';
}, 2000)
}
使用uni-badge, 插入图标, 优化性别显示
测试demo数据
const demo=[{
avatar:'../../static/default.jpg',
username:'昵称',
sex:1,
age:24,
isFollow:false
},
{
avatar:'../../static/default.jpg',
username:'昵称',
sex:2,
age:24,
isFollow:true
}
];
数据渲染,动态绑定性别class, 点击灰色
封装组件, 引入组件
{{item.username}}
import userList from '@/components/user-list/user-list.vue';
优化scrollH问题,引入首页方法
onLoad() {
this.getData();
const res = uni.getSystemInfoSync();
this.scrollH = res.windowHeight - uni.upx2px(101);
// console.log(this.scrollH);
},
隐藏上拉加载组件
新建页面user-chat, 导航进入
配置导航栏
{
"path" : "pages/user-chat/user-chat",
"style" :{
"app-plus": {
"titleNView": {
"buttons": [
{
"color": "#333333",
"colorPressed": "#FD597C",
"float": "right",
"fontSize": "20px",
"fontSrc": "/static/iconfont.ttf",
"text": "\ue628"
}
]
}
}
}
底部操作条开发
scrollH获取
{{i}}
onLoad() {
const res = uni.getSystemInfoSync();
this.scrollH = res.windowHeight - uni.upx2px(101);
},
聊天列表组件开发
右边气泡的开发
你好啊
你好啊
新建user-chat-list, 封装数据
计算属性, 是否本人
isShelf(){
return this.item.userId===1
},
时间显示开发
{{shortTime}}
引入time.js, 优化时间显示, 用计算属性
shortTime(){
return $T.getChatTime(this.item.create_time,this.preTime);
}
输入框绑定内容, 绑定发送事件, 发送功能实现
sendMessage(){
let obj={
userId:1,
avatar: '../../static/default.jpg',
data: this.content,
type: 'text',
create_time: (new Date()).getTime()
};
if(obj.data===''){
uni.showToast({
title:"请输入内容"
});
return;
}
this.list.push(obj);
this.content=''
}
优化功能, 最小宽度去掉, 键盘推页面false, 清空输入框, 丢弃scrollH
滚动到底部实现
pageToBottom(){
let lastIndex=this.list.length-1;
if(lastIndex < 0){
return
}
this.scrollInto='chat'+lastIndex;
console.log(this.scrollInto);
}
onReady() {
this.pageToBottom();
},
添加搜索标识
onNavigationBarSearchInputClicked() {
uni.navigateTo({
url: '../search/search?type=post'
})
},
获取类型, 修改搜索占位, 添加如果说是app端
if (e.type) {
this.type = e.type;
}
let pageTitle='';
switch (this.type) {
case 'post':
pageTitle='搜索帖子'
break;
case 'topic':
pageTitle='搜索话题'
break;
case 'friend':
pageTitle='搜索好友'
break;
}
console.log(this.type);
// #ifdef APP-PLUS
let currentWebview=this.$scope.$getAppWebview();
let tn=currentWebview.getStyle().titleNView;
tn.searchInput.placeholder=pageTitle;
console.log(tn);
currentWebview.setStyle({
titleNView:tn
})
// #e
搜索结果完善优化, 根据不同搜索,组件,数据都要不同
searchEvent() {
uni.hideKeyboard();
uni.showLoading({
title: '加载中'
})
setTimeout(() => {
switch (this.type) {
case 'post':
this.serachList = demo1;
break;
case 'topic':
this.serachList = demo2;
break;
case 'friend':
this.serachList = demo3;
break;
}
uni.hideLoading();
}, 3000)
},
新建页面,detail, 导航入口
,{
"path" : "pages/detail/detail",
"style" :
{
"app-plus": {
"titleNView": {
"buttons": [
{
"float": "right",
"type": "menu"
}
]
}
}
}
}
把对象作为参数传过去,初始化
openDetail(){
console.log("打开详情页");
uni.navigateTo({
url:'../../pages/detail/detail?detail='+JSON.stringify(this.item)
})
},
onLoad(e){
if(e.detail){
this.__init(JSON.parse(e.detail));
}
},
methods: {
__init(data){
uni.setNavigationBarTitle({
title:data.title
})
}
}
修改公共列表组件, 添加isDetail, prop, 评论和分享功能
props: {
item: Object,
index: {
type: Number,
default: -1
},
isDetail: {
type: Boolean,
default: false
}
},
doComment(){
if(!this.isDetail){
return this.openDetail();
}
this.$emit('doComment');
},
doShare(){
if(!this.isDetail){
return this.openDetail();
}
this.$emit('doShare');
}
帖子详请
关注事件, 修改index默认值
follow() {
this.info.isFollow = true;
}
index: {
type: Number,
default: -1
}
顶踩方法改写
doSupport(e) {
let obj = this.info
if (obj.support.type === e.type) {
uni.showToast({
title: '你已经操作过了'
})
return;
}
if (obj.support.type === '') {
//无操作
obj.support[e.type + '_count']++;
} else if (obj.support.type === 'support' && e.type === 'unsupport') {
//之前是顶,顶减一,踩加一
obj.support.support_count--;
obj.support.unsupport_count++;
} else if (obj.support.type === 'unsupport' && e.type === 'support') {
//之前是踩,顶加一,踩减一
obj.support.support_count++;
obj.support.unsupport_count--;
}
obj.support.type = e.type;
let msg = e.type === 'support' ? '顶' : '踩';
uni.showToast({
title: msg + '成功'
})
}
增加content,image
content:"Hillky正在开发ing.....",
images:[
{
url:"https://tupian.qqw21.com/article/UploadPic/2020-5/20205622141239876.jpg"
},
{
url:"https://tse1-mm.cn.bing.net/th/id/R-C.df1d553893d9b7888c725b8dbcbcf439?rik=hpbIzO6xZ3Qchw&riu=http%3a%2f%2fwww.chabeichong.com%2fimages%2f2016%2f11%2f12-04122113.jpg&ehk=%2fe971CgX%2bMeAgZuGCVac3td74wDOd1%2bWzz0q4IsP1Lc%3d&risl=&pid=ImgRaw&r=0&sres=1&sresct=1"
}
]
增加图片预览功能
preview(index){
// console.log(this.imageList);
uni.previewImage({
urls:this.imageList,
current:index
})
}
computed:{
imageList(){
return this.info.images.map(item=>item.url);
}
},
先对聊天室底部操作条的封装,测试是否成功
submit(content) {
let obj = {
userId: 1,
avatar: '../../static/default.jpg',
data: content,
type: 'text',
create_time: (new Date()).getTime()
};
this.list.push(obj);
this.pageToBottom();
},
再到detail页面使用该组件,需要占位
使用官方评论界面,进行静态开发
网友
08/10 08:12
很酷的HBuilderX和uni-app,开发一次既能生成小程序,又能生成App
弹出层,底部弹出, 监听导航栏按钮触发, 层级关系的修改-z-index
123
onNavigationBarButtonTap() {
this.$refs.popup.open();
},
uni-popup {
position: fixed;
/* #ifndef APP-NVUE */
z-index: 9999;
监听返回事件,隐藏弹出层
onBackPress() {
this.$refs.popup.close();
},
静态开发
分享到
QQ好友
...
取消
遍历图标
{{item.name}}
封装组件 more-share.vue
分享到
{{item.name}}
取消
onNavigationBarButtonTap() {
this.$refs.share.open();
},
onBackPress() {
this.$refs.share.close();
},
用官方组件分享动态渲染数据, 子组件用created()
created(){
uni.getProvider({
service: 'share',
success: (e) => {
console.log(e);
let data = []
for (let i = 0; i < e.provider.length; i++) {
switch (e.provider[i]) {
case 'weixin':
data.push({
name: '微信好友',
id: 'weixin',
icon:'icon-weixin',
color:'bg-success',
sort:0
})
data.push({
name: '朋友圈',
id: 'weixin',
icon:'icon-huati',
color:'bg-dark',
type:'WXSenceTimeline',
sort:1
})
break;
case 'sinaweibo':
data.push({
name: '新浪微博',
icon:'icon-xinlangweibo',
color:'bg-danger',
id: 'sinaweibo',
sort:2
})
break;
case 'qq':
data.push({
name: 'QQ好友',
id: 'qq',
icon:'icon-QQ',
color:'bg-primary',
sort:3
})
break;
default:
break;
}
}
this.providerList = data.sort((x,y) => {
return x.sort - y.sort
});
},
fail: (e) => {
console.log('获取分享通道失败', e);
uni.showModal({
content:'获取分享通道失败',
showCancel:false
})
}
});
},
分享方法
async share(e) {
console.log('分享通道:'+ e.id +'; 分享类型:' + this.shareType);
if(!this.shareText && (this.shareType === 1 || this.shareType === 0)){
uni.showModal({
content:'分享内容不能为空',
showCancel:false
})
return;
}
if(!this.image && (this.shareType === 2 || this.shareType === 0)){
uni.showModal({
content:'分享图片不能为空',
showCancel:false
})
return;
}
let shareOPtions = {
provider: e.id,
scene: e.type && e.type === 'WXSenceTimeline' ? 'WXSenceTimeline' : 'WXSceneSession', //WXSceneSession”分享到聊天界面,“WXSenceTimeline”分享到朋友圈,“WXSceneFavorite”分享到微信收藏
type: this.shareType,
success: (e) => {
console.log('success', e);
uni.showModal({
content: '已分享',
showCancel:false
})
},
fail: (e) => {
console.log('fail', e)
uni.showModal({
content: e.errMsg,
showCancel:false
})
},
complete:function(){
console.log('分享操作结束!')
}
}
switch (this.shareType){
case 0:
shareOPtions.summary = this.shareText;
shareOPtions.imageUrl = this.image;
shareOPtions.title = '欢迎体验uniapp';
shareOPtions.href = 'https://uniapp.dcloud.io';
break;
case 1:
shareOPtions.summary = this.shareText;
break;
case 2:
shareOPtions.imageUrl = this.image;
break;
case 5:
shareOPtions.imageUrl = this.image ? this.image : 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/b6304f00-5168-11eb-bd01-97bc1429a9ff.png'
shareOPtions.title = '欢迎体验uniapp';
shareOPtions.miniProgram = {
id:'gh_33446d7f7a26',
path:'/pages/tabBar/component/component',
webUrl:'https://uniapp.dcloud.io',
type:0
};
break;
default:
break;
}
if(shareOPtions.type === 0 && plus.os.name === 'iOS'){//如果是图文分享,且是ios平台,则压缩图片
shareOPtions.imageUrl = await this.compress();
}
if(shareOPtions.type === 1 && shareOPtions.provider === 'qq'){//如果是分享文字到qq,则必须加上href和title
shareOPtions.href = 'https://uniapp.dcloud.io';
shareOPtions.title = '欢迎体验uniapp';
}
uni.share(shareOPtions);
},
配置page.json
{
"path": "pages/my/my",
"style": {
"navigationBarTitleText": "我的",
"app-plus": {
"titleNView": {
"buttons": [
{
"type": "menu"
}
]
}
}
}
},
静态开发第一个view
昵称
总帖子10 今日发帖0
第二个view开发,使用遍历方式
{{item.num}}
{{item.name}}
第三个view, 广告位的开发
引入uni-list-item
import uniListItem from '@/components/uni-list-item/uni-list-item.vue';
extraIcon1: {
type: 'eye',
color: '#000000',
size: 20
},
extraIcon2: {
type: 'vip',
color: '#000000',
size: 20
},
新建页面,导航进入
退出登录静态开发
新建页面,导航进入
uni.navigateTo({
url:'../userPassword/userPassword'
})
静态页面开发
输入框绑定vue, disabled属性绑定
computed:{
disable(){
return this.oldPassword===''||this.newPassword===''||this.renewPassword==='';
}
},
验证功能实现
check(){
if(this.newPassword!==this.renewPassword){
uni.showToast({
title:'两次输入密码不一致',
icon:"none"
})
return false;
}
return true;
},
submit(){
if(this.check()){
console.log('提交成功');
}
}
新建页面, 配置page.json
,{
"path" : "pages/userEmail/userEmail",
"style" :
{
"navigationBarTitleText": "设置邮箱"
}
}
拼接字符串, 配置导航,引号不一样用1左边的那个,${}拼接
open(path){
uni.navigateTo({
url:`../${path}/${path}`,
fail(e) {
console.log(e);
}
})
}
静态页面开发,与修改密码差不多的功能,禁用
利用正则表达式完成邮箱功能验证js常用正则表达式
methods: {
check(){
var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
if(!ePattern.test(this.email)){
uni.showToast({
title:'邮箱格式不正确',
icon:"none"
})
return false;
}
return true;
},
submit(){
if(this.check()){
console.log("提交成功");
}
return;
}
}
新建页面,配置page.json,配置导航
,{
"path" : "pages/userInfo/userInfo",
"style" :
{
"navigationBarTitleText": "资料编辑"
}
}
使用uni-list-item实现静态页面,使用插槽修改
哈哈
未知
2021-4-1
已婚
程序员
广东广州
添加点击事件, 动态绑定userPIc
uni.chooseImage的使用, 修改头像功能实现
changePic(){
uni.chooseImage({
count:1,
sizeType:["compressed"],
sourceType:["album","camera"],
success:(e)=>{
this.userPic=e.tempFilePaths[0];
}
})
}
修改昵称,用输入框
修改性别, 使用showActionSheet,使用计算属性渲染
{{sexText}}
const sexArray=["保密","男","女"];
sex:0,
sexText(){
return sexArray[this.sex];
},
changeSex(){
uni.showActionSheet({
itemList:sexArray,
success:(e)=>{
// this.sex=sexArray[e.tapIndex];
this.sex=e.tapIndex;
}
})
},
修改情感, 使用一样的方法
修改职业, 使用一样的方法
changeJob(){
uni.showActionSheet({
itemList:jobArray,
success:(e)=>{
this.job=jobArray[e.tapIndex];
}
})
}
使用picker,完成该功能
{{birthday}}
onDateChange(e){
this.birthday=e.detail.value;
}
使用官方组件mpvueCityPicker
{{pickerText}}
import mpvueCityPicker from '@/components/mpvue-citypicker/mpvueCityPicker.vue'
mpvueCityPicker
themeColor:'#007AFF',
cityPickerValueDefault:[0, 0, 1],
pickerText:'广东广州'
onBackPress() {
if (this.$refs.mpvueCityPicker.showPicker) {
this.$refs.mpvueCityPicker.pickerCancel();
return true;
}
},
onUnload() {
if (this.$refs.mpvueCityPicker.showPicker) {
this.$refs.mpvueCityPicker.pickerCancel()
}
},
onConfirm(e){
this.pickerText = e.label;
},
showCityPicker(){
this.$refs.mpvueCityPicker.show()
}
新建页面,配置page.json
使用组件uni-collapse
折叠内容
折叠内容
新建页面,配置page.json
静态页面开发
version 1.0.1
新建页面,取消原生导航,导航进入
,{
"path" : "pages/login/login",
"style" :
{
"navigationBarTitleText": "",
"app-plus": {
"titleNView": false
}
}
}
昵称
总帖子10 今日发帖0
x的样式开发
var res=uni.getSystemInfoSync();
this.statusBarHeight=res.statusBarHeight;
back(){
uni.navigateBack({
delta:1
})
}
对之前的开发进行修改,引用一个view代替状态栏即可
状态栏下的文字
静态页面开发
账号密码登录
忘记密码
验证码登录
|
登录遇到问题
社交账号登录
静态开发图标列表
注册即代表同意《xxx社区协议》
切换验证码的静态显示
{{status?'账号密码登录':'验证码登录'}}
忘记密码
+86
获取验证码
changeStatus(){
this.status=!this.status
}
输入框绑定内容,计算属性disable要对于账号密码与手机验证码都ok
disabled(){
if((this.username===''||this.password==='')&&(this.phone===''||this.code==='')){
return true;
}
return false;
}
切换登录方式要初始化表单
initForm(){
this.username='';
this.password='';
this.phone='';
this.code='';
},
changeStatus(){
this.initForm();
this.status=!this.status
}
获取验证码的功能, 倒计时的功能
getCode(){
if(this.codeTime>0){
return;
}
this.codeTime=60;
let timer=setInterval(()=>{
if(this.codeTime>=1){
this.codeTime--;
}else{
this.codeTime=0;
clearInterval(timer);
}
},1000)
}
{{codeTime>0?this.codeTime+'s':'获取验证码'}}
验证手机号规则编写,用正则表达式验证, 提交方法绑定
getCode() {
if (this.codeTime > 0) {
return;
}
if(!this.validate()){
return;
}
this.codeTime = 60;
let timer = setInterval(() => {
if (this.codeTime >= 1) {
this.codeTime--;
} else {
this.codeTime = 0;
clearInterval(timer);
}
}, 1000)
},
validate() {
var mPattern = /^1[34578]\d{9}$/;
var flag = mPattern.test(this.phone)
// console.log(flag);
if (!flag) {
uni.showToast({
title: '手机格式不正确',
icon: "none"
})
return false;
}
return true;
},
submit() {
if(!this.validate()){
return;
}
console.log('验证成功');
this.validate();
}
新建other-login组件,实现第三方登录
新建页面, 配置导航栏按钮,导航进入
,{
"path" : "pages/user-space/user-space",
"style" :
{
"navigationBarTitleText": "",
"app-plus": {
"titleNView": {
"titleText": "个人空间",
"buttons": [
{
"type": "menu"
}
]
}
}
}
}
openSapce() {
uni.navigateTo({
url:'../../pages/user-space/user-space'
})
},
静态开发
1
粉丝
1
粉丝
1
粉丝
借用好友列表的tabBar
{{item.name}}
data() {
return {
tabIndex:0,
tabBars: [{
name: '主页',
},
{
name: '帖子',
},
{
name: '动态',
}
]
}
},
changeTab(index){
this.tabIndex=index;
}
主页的实现
账号信息
账号年龄:12个月
账号id:1
个人信息
星座:天蝎座
职业:IT
故乡:中国
情感:未婚
帖子/动态
帖子动态的实现, 引入commonlist组件,loadMore组件,引入方法,添加动画效果
follow(index) {
let obj=this.tabBars[this.tabIndex].list[index];
obj.isFollow=true;
uni.showToast({
title: '关注成功'
})
},
doSupport(e) {
let obj=this.tabBars[this.tabIndex].list[e.index]
console.log(obj);
if (obj.support.type === '') {
//无操作
obj.support[e.type + '_count']++;
} else if (obj.support.type === 'support' && e.type === 'unsupport') {
//之前是顶,顶减一,踩加一
obj.support.support_count--;
obj.support.unsupport_count++;
} else if (obj.support.type === 'unsupport' && e.type === 'support') {
//之前是踩,顶加一,踩减一
obj.support.support_count++;
obj.support.unsupport_count--;
}
obj.support.type = e.type;
let msg = e.type === 'support' ? '顶' : '踩';
uni.showToast({
title: msg + '成功'
})
},
使用弹出层,进行修改即可
加入黑名单
聊天
onNavigationBarButtonTap() {
this.$refs.popup.open();
},
==文档只有一些功能缺失,但源码已经完善所有功能,详情请点击码云地址下载源码学习 https://gitee.com/HelLichu/friend ==