Технический отбор
Компании нужно сделать приложение, апплет WeChat и апплет Alipay на трех концах.После ознакомления с некоторой информацией я, наконец, решил использовать uni-app.Ниже приведены некоторые статьи о выборе других старших технологий.Вы можете изучить это .
официальная документация uni-приложения:
Подборка статей о Наггетс:
После сравнения и сравнения с ситуацией в нашей компании технический директор выбрал uni-app.
Яма, я думаю?
На самом деле, я не думаю, что мой уровень может судить о качестве фреймворка, я просто кратко рассказываю об опыте разработки, я думаю, что есть примерно три типа питов.
1: Есть функции, которых нет у фреймворка, а есть вещи, которые невозможно реализовать.
2: Очевидные ошибки, вызывающие проблемы с программой и влияющие на ход и результаты разработки.
3: В процессе разработки я развивал свою интуицию и опыт, и результаты отличались от моих ожиданий.Прочитав документ, я обнаружил, что он отличается от метода написания, накопленного предыдущим опытом.Метод написания, но я не справился с совместимостью, и были нестыковки в эффектах разных концов.Когда я перечитаю документ и найду проблему, будет настоящая яма.
В целом, этот путь разработки Uni-приложений относительно гладкий.
Поездка в яму
Предисловие: Я рассказываю только о проблемах и трудностях, с которыми я столкнулся, и некоторых моментах, на которые следует обратить внимание, и способах их решения.Я не буду рассказывать о том, как пользоваться uni-app.Как им пользоваться, вы должны прочитать документацию , документация написана более понятно
единица измерения пикселей
Используйте upx/rpx вместо px
Измененный контент (исправление от большого парня в области комментариев):1px = 2upx является неточным, upx и rpx являются чувствительными единицами, берут 750px в качестве базовой ширины и автоматически настраиваются в соответствии с шириной экрана устройства.
Представьте vuex
Обычный метод импорта неприемлем в uniapp, он должен быть вmian.js
, смонтировать один раз на прототипе vue
Обновление 20 апреля: Друг в области комментариев предположил, что теперь Vuex теперь может быть введен в эту форму. Я думаю, что это контент после оптимизации команды UNIAPP.
маршрутизация
Все маршруты uni-app настроены вpage.json
В этом файле проблема в том, что когда разрабатывают несколько человек, роутинг нельзя разделить, если его плохо обрабатывать, часто возникают конфликты. Что касается некоторых из этих элементов конфигурации, пожалуйста, обратитесь к официальной документации.
На странице нет спец.$route
а также$router
Объекты могут принимать параметры маршрутизации только в течение жизненного цикла страницы, подробности см. в документации.
路由传参方式
let url = `/pages/shopManagement/sonPage/billDetails?StoreID=${StoreID}`
Способ подключения маршрута:
onLoad(route){
this.getData.StoreID=route.StoreID
this.getCurryInfo()
},
onLoad接收到一个参数对象
Манипуляции с DOM
Если ваш проект только h5, вы можете уверенно использовать операцию dom, но если вы хотите работать в апплете и приложении, не выполняйте операцию dom, она не подействует.
Тем не менее, ref все еще можно использовать, и вы также можете получить эту ноду, что делать.
Жизненный цикл
Когда дело доходит до ссылки, я должен упомянуть жизненный цикл
Конкретный жизненный цикл можно увидеть в документе для деталей.
Примерно так же, как и в Vue, он делится на жизненный цикл страницы и жизненный цикл приложения.Жизненный цикл страницы предназначен для одной страницы, а жизненный цикл приложения — для всего апплета/приложения, но я предлагаю некоторые ситуации во время разработки.
У компонентов нет жизненного цикла, да, вы правильно прочитали! Например, страница а относится к компоненту б.В компоненте б onLoad, onShow и onReady все терпят неудачу, но использование created и mount эффективно, но я все равно не использовал created и mount при разработке, ведь в документе четко указано это
Таким образом я избегаю жизненного цикла использования оригинального vue в компоненте.Кроме того, я упоминал ref выше.Если вы хотите использовать ref в инициализации, вы должны обратить внимание на жизненный цикл.В хуках onload и show, если внутренняя операция синхронная, она не будет использоваться.$refs
, я не знаю, как объяснить эту проблему. Это очень хорошо объяснено в vue. Я не могу получить ссылку в файле created, потому что дом не был отрендерен. Я могу получить ссылку только тогда, когда дом отображается при монтировании, но юниап не без дом. . . . . Я не вникал в это.Если вы хотите использовать его, вы можете использовать его только асинхронно.Можно добавить setTimeout или использовать его после запроса.Вы можете получить реф в это время.
201912.2 обновление
В последние месяцы был открыт новый проект, и он очень быстрый, но с созданием первого приложения развитие идет очень гладко.
Заодно пересобираем фоновую систему, иногда div и view тупые и всегда неправильные.
Ок, приступим к делу, сегодня увидел друга в группе по обмену, спрашивавшего о жизненном цикле компонента, и я тоже поделился своими сомнениями, так что сразу выложу картинку на всеобщее обозрение.
Другими словами, на самом деле возможно использовать собственный жизненный цикл vue в компонентах, не являющихся страничными.Я не пробовал это раньше, поэтому всегда избегал этого использования и добавлял много вещей в жизненный цикл страницы.
О запросе
Вначале мы просто инкапсулировали запрос, отправленный самими собой.
export const HttpRequest_ = {
config: function(name) {
var info = null;
if (name) {
var name2 = name.split("."); //字符分割
if (name2.length > 1) {
info = configdata[name2[0]][name2[1]] || null;
} else {
info = configdata[name] || null;
}
if (info == null) {
let web_config = cache.get("web_config");
if (web_config) {
if (name2.length > 1) {
info = web_config[name2[0]][name2[1]] || null;
} else {
info = web_config[name] || null;
}
}
}
}
return info;
},
post: function(url, data, header) {
header = header || "application/x-www-form-urlencoded";
//url = this.config("APIHOST")+url;
return new Promise((succ, error) => {
showLoading_()
uni.request({
url: url,
data: data,
method: "POST",
header: {
"content-type": header
},
success: function(result) {
hidLoading_()
succ.call(self, result.data)
},
fail: function(e) {
hidLoading_()
error.call(self, e)
}
})
}).then(res=>{
console.log(res)
return res
},err=>{
console.log('err:',err)
})
},
get: function(url, data, header) {
header = header || "application/x-www-form-urlencoded";
//url = this.config("APIHOST")+url;
return new Promise((succ, error) => {
showLoading_()// 加载中
uni.request({
url: url,
data: data,
method: "GET",
header: {
"content-type": header
},
success: function(result) {
hidLoading_() //关闭加载中
succ.call(self, result.data)
},
fail: function(e) {
hidLoading_() //关闭加载中
error.call(self, e)
}
})
}).then(res=>{
console.log(res)
return res
},err=>{
uni.showToast({
duration:2000,
title:'数据异常,请稍后再试',
icon:'none'
})
console.log('err:',err)
})
}
}
Раньше я думал, что могу использовать только их метод request для отправки запросов в Uniapp, потом коллеги сказали, что можно использовать и другие методы.
Затем мы импортируем другие библиотеки. Это упаковано другими на рынке плагинов uniapp, и его более удобно использовать.
Панель навигации
Одна из проблем, на которую обращает внимание навигационная панель, — разные формы отображения с разных сторон, поэтому нужно решать вопросы совместимости.
Панель навигации может быть настроена, предоставлена платформой, и некоторые плагины все еще могут использоваться.Просто обратите внимание на разницу в отображении.Если есть несколько конечных требований, вы должны запустить его на разных концах, чтобы увидеть эффект , а то придет время будет надоедать. Панель навигации colorUi, которую мы использовали, я немного изменил.
В апплете Alipay родную навигационную панель нельзя отменить, поэтому нельзя использовать кастомный плагин, нужноpage.json
Настройте собственную панель навигации в
Случайно найденная страница, наша навигация в шапке условно составлена:
стиль динамического класса
Конкретная документация находится здесь:
Сначала я этого не замечал, писал по каким-то своим обычным привычкам и без проблем отлаживал с h5, потом обнаружил, что все они провалились после использования реальной машины и средств разработки апплетов.
Откройте сторонний веб-сайт или приложение
Если вы хотите открыть сторонний веб-сайт или программу на стороне приложения, вы должны различать ios и Android.
Прежде всего, ios и android вызывают разные адреса сторонних приложений.
Будь то отладка или упаковка, вызов сторонних программ, настройка белого списка на стороне ios
Трехсторонний вход
Пример входа в WeChat:
На стороне приложения несколько методов интеграции с единым приложением могут беспрепятственно получать некоторую информацию о столбцах, такую как unionId, openid и т. д.
uni.getProvider({//获取uniapp支持的第三方数据
service:'oauth'
}).then(data=>{
var [err,res] = data
var providers=res.provider//类型(微信,新浪,小米,qq)
var flagIndex=providers.indexOf(provider)
if(flagIndex>-1){
return providers[flagIndex] /
}
}).then(res=>{
return uni.login({//登陆接口(可以获取用户信息)
provider:res,
scopes:'auth_base',
timeout:20000,
})
}).then(data=>{//返回一系列登陆信息
var [err,res] = data
if(res.errMsg==="login:ok"){
self.authResult=res.authResult
return res.authResult
}
}
}).then(res=>{//获取用户的信息 头像,地址,等等等
return uni.getUserInfo({
provider:provider,
timeout:20000,
withCredentials:true
})
}).then(data=>{//得到一些列用户信息
var [err,res] = data
console.log(res)
if(res.errMsg==="getUserInfo:ok"){
return res
}
})
Но если это на стороне апплета, многие методы не сработают, потому что у апплета есть своя собственная стратегия трехстороннего взаимодействия при входе в систему.
Я до сих пор помню, как после того, как я успешно протестировал трехсторонний вход в WeChat в приложении, руководитель подошел, чтобы проверить прогресс, и спросил, как работает апплет. хорошо? Я похлопал себя по груди и сказал, что нет проблем, я просто сел на борт, так и получилось. . . . . . . . . . . . . . . лицо боль
uni.login({//登陆接口
provider:'weixin',
scopes:'auth_base',
timeout:20000,
}).then(data=>{//返回一系列登陆信息
let [err,res] = data
if(res.code){
let data ={//这个code很重要,需要拿到code向后台去换unionid等
js_code: res.code
}
return this.$Request.get(this.$store.state.getopenidUrl,data)
}else{
setTimeout(()=>{
this.$api.msg('数据异常')
},500)
uni.switchTab({
url:'/pages/index/index'
})
}
}).then(res=>{
let res_ = JSON.parse(res.Data)
if('unionid' in res_){
this.getIsBindData.openid=res_.unionid
this.getDataWX.openid = res_.unionid
this.getDataWX.unionid = res_.openid
}else{
this.getIsBindData.openid=res_.openid
this.getDataWX.openid = res_.openid
this.getDataWX.unionid = res_.openid
}
return this.WXuserInfo
})
Я не пробовал другие трехсторонние входы в систему, но обязательно обратите внимание на различия между каждым
Кроме того, не интегрировано стороннее юни-приложение входа в Alipay.Если вы хотите сделать это самостоятельно, вы можете написать его нативно.Теоретически это можно сделать. Так как наша команда не нативная, мы попытались использовать webview как трехсторонний логин для Alipay, но окончательно застряли на части авторизации, и не смогли этого сделать, поэтому кастрировали это требование.
2019 Обновление 8.20:
На рынке плагинов уже есть плагины (платные плагины) для авторизованных данных для входа на Android и ios:
canvas
Написано как компонент недопустимо для апплета и может использоваться только на индексной странице. Он вступает в силу в h5, и его можно инкапсулировать в компонент. Эффект рендеринга не очень хороший. Я не пробовал его на стороне приложения. Поскольку эффект не очень хороший, я временно отложил это требование.
Исправления от друзей в разделе комментариев:Как использовала сборка холста, прохождение второго аргумента запомнить Объекты экземпляра компонента: UNI.CREATECANVASCONTEXT (CANVASID, IS)
Я пробовал.При инкапсуляции в компонент передайте это, и апплет вступит в силу.Раньше он не передавался.
Обратите внимание на настройку модулей разрешений и sdk
Я никогда раньше не писал приложения или апплеты, я недостаточно чувствителен к некоторым вещам
Когда я отлаживал карту, навигацию и другие функции, все было очень гладко, потом упаковка не удалась, потому что она была неправильно настроена, оказалось, что мы использовали Uniapp при отладке.
Кроме того, когда вам нужно использовать некоторые разрешения, не забудьте перейти к manifest.json для настройки.В целом конфигурация графического интерфейса относительно дружелюбна, а конфигурация исходного кода не так уж сложна, и вы можете ее найти.
Лично рекомендуется использовать пользовательскую базу, если это реальная отладка машины, старайтесь не использовать базу, предоставленную uniapp, чтобы избежать некоторых помех, со стандартной базой проблем нет, но будут проблемы, как только он будет упакован, будет лучше использовать пользовательскую базу.
nvue
Weex слишком много волшебных вещей, я не буду перечислять их
Например, у weex есть своя гибкая верстка, но порядок расположения вертикальный, думаете это головная боль?
Было очень больно, когда я использовал родной плагин для написания стиля. Было несколько вещей, которые я думал, что смогу решить за минуты, но я не мог сделать это в течение длительного времени. Я все еще думал, не было ли это ошибка памяти? Это не так используется. Я давно проверял, и результат все еще не работает. Я вдруг понял, что это не используется так в weex. Я посмотрел документ, и это правда!
Лично рекомендуется сначала прочитать документацию weex или проверить, как что-то использовать, прежде чем использовать это. Не пытайтесь бороться с другим набором стандартных CSS, основываясь на своих знаниях CSS, это никогда не будет правильным.
2019 Обновление 8.20:
Друзья в комментариях добавили:nvue для поддержки upx, необходимо использовать режим компиляции uni-app, а не режим компиляции weex
загрузочный экран
uni-app не нужно включать этот элемент конфигурации, это можно сделать только с некоторыми стратегиями.
По сути, это имитационное руководство по открытию экрана, состоящее из компонента swiper + локальный кеш.Обратите внимание, если продукт изначально позиционируется как страница руководства, то подумайте, как написать индекс, мы планируем добавить его позже. Изменить индекс немного дорого, поэтому используется другая стратегия, но если что-то неловкое произойдет на мобильном телефоне с плохой производительностью, я не буду подробно описывать, насколько это неловко.Если используется вышеуказанная стратегия, это будет неловко. Это просто белый экран.В демке выше в индексе просто транзитная страница и ничего не пишется. Поэтому я бы рекомендовал использовать вышеописанную стратегию.
псевдоним пути
Пока у меня нет файла или метода, который я не нашел, как настроить псевдонимы путей.
В uniapp @ означает корневой путь, но вся файловая структура по-прежнему очень понятна, файлов конфигурации не так много, весь корневой файл очень похож на обычный каталог src, и в принципе удобно использовать @.
Рынок плагинов и экология
В целом, рынок плагинов Uniapp все еще хорош. Большинство плагинов, которые можно использовать, можно найти. Если вы не можете их найти, вы также можете найти вдохновение в некоторых похожих плагинах. Вы можете изменить это. сам.Форум тоже в порядке.В принципе, я могу найти ответ на проблемы, с которыми я сталкиваюсь, но есть и такие, которые я не могу найти или кто-то спрашивал, но никто не отвечает. Официальная группа QQ все еще довольно живая. С некоторыми вещами я не сталкивался сам, посмотрите на проблемы и решения других людей.Это своего рода рост, и я очень рад сказать спасибо за ответ, что я встречал.
Сжать изображение
2019 8.16 Обновить
Документация:
Я не знаю, почему интерфейс uni.compressImage(OBJECT) не работает на стороне приложения. Вступает в силу апплет WeChat. Сообщение об ошибке также очень простое, то есть сжатие не удалось. Других подсказок нет. поспрашивал в официальной группе и мне никто не ответил. , почитав сообщество, особо ценного ответа нет.
Позже, медленно обдумывая момент, мой брат также сделал ссылку на статью (в статье также есть метод преобразования base64), инкапсулирующий простую функцию.
Справочная статья:
/*
src:图片的本地路径
quality:压缩范围 0-100
*/
function zipImage(src,quality=30){
// #ifdef APP-PLUS app
let index = src.lastIndexOf(".")
let imgDirname = src.substring(0,index)//图片的原始地址
let imgName = new Date().getTime();//压缩后的文件
let imgType = src.substring(index+1,src.length);//图片的类型
return new Promise((resolve,rej)=>{
plus.zip.compressImage({
src,
dst: imgDirname+imgName+'.'+imgType,
quality,
}, res => {
resolve(res.target)
}, err => {
console.log(err);
rej(err)
});
})
// #endif
// #ifdef MP-WEIXIN 微信小程序
return new Promise((resolve,rej)=>{
uni.compressImage({
src,
success:(res)=>{
console.log(res,1)
let path = res.tempFilePath
resolve(path)
// this.imgList.push(path)
// this.imgList.push
},
fail:(e)=>{
uni.showToast({
title:'上传失败,请重新上传',
duration:2000
})
},
complete:(val)=>{
console.log(val,3)
}
})
})
// #endif
}
При вызове сжатый путь к изображению будет выдан напрямую.
uni.chooseImage({
success:(res)=>{
res.tempFiles.forEach(async (it)=>{
let localPath =it.path
localPath = await this.$api.zipImage(localPath) //await一下就可以接住了
this.imageList.push({
value:localPath
})
})
}
});
20120 2.19 Обновить
За последнее время я написал два проекта uniapp, и принципиально ни на какие ямы не наступал.
Однако было добавлено несколько новых функций, которые кратко описаны здесь.
Первый — это push приложения, второй — голосовая трансляция, а третий — прямая трансляция.
приложение push
Это официальное описание.После завершения настройки можно начинать тест,но перед тестом нужно получить cid.Функция получения cid такая
const clientInfo = plus.push.getClientInfo()
let pushInfo = {
clientid: clientInfo.clientid,
appid: clientInfo.appid,
appkey: clientInfo.appkey
};
//这端代码可以拿到需要的一些信息,包括cid
//拿到cid就可以开始发送测试的推送了
Что касается разницы между прозрачной передачей и информацией панели уведомлений, то в Baidu или поиске Google есть много подробных статей, которые более подробны, чем то, что я сказал, поэтому я не буду вдаваться в подробности.
Перед получением push вы также можете проверить, видит ли пользователь разрешение на push, и сразу перейти к коду.
async function pushPower(phoneType){
if(phoneType==='android'){//如果是安卓
console.log('安卓')
let main = plus.android.runtimeMainActivity();
let pkName = main.getPackageName();
let NotificationManagerCompat plus.android.importClass("android.support.v4.app.NotificationManagerCompat");
let packageNames = NotificationManagerCompat.from(main);
// console.log(JSON.stringify(packageNames));
if (packageNames.areNotificationsEnabled()) {
console.log('已开启通知权限');
}else{
/*这段函数是自己封装的弹框询问*/
let res = await this.$api.showModal({
title: '是否开启推送权限',
content: '您还未开启推送权限,是否开启?不开启推送权限部分功能将不完善。'
})
/*这段函数是自己封装的弹框询问*/
if(res){
let Intent = plus.android.importClass('android.content.Intent');
let intent = neIntent('android.settings.APP_NOTIFICATION_SETTINGS');//可设置表中所有Action字段
intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
main.startActivity(intent);
}
}
}else if(phoneType==='ios'){//如果是ios
let UIApplication = plus.ios.import("UIApplication");
let app = UIApplication.sharedApplication();
let enabledTypes = 0;
if (app.currentUserNotificationSettings) {
let settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
} else {
//针对低版本ios系统
enabledTypes = app.enabledRemoteNotificationTypes();
}
plus.ios.deleteObject(app);
if ( 0 == enabledTypes ) {
/*这段函数是自己封装的弹框询问*/
let res = await this.$api.showModal({
title: '是否开启推送权限',
content: '您还未开启推送权限,是否开启?不开启推送权限部分功能将不完善。'
})
/*这段函数是自己封装的弹框询问*/
if(res){
let UIApplication = plus.ios.import("UIApplication");
let NSURL = plus.ios.import("NSURL");
let setting = NSURL.URLWithString("app-settings:");
let application = UIApplication.sharedApplication();
application.openURL(setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(application);
}
}
}
}
В любом случае, делать ли проверку разрешений или нет, зависит от ваших потребностей.
Последний шаг - мониторить информацию о пуше. Я не буду приводить сюда свой код, а предоставлю вам статью. В этой статье подробно написано, как мониторить пуши.
спросите. Когда cloud.net.can/article/366…Для внешнего интерфейса вам нужно только увидеть его [8] для подробной демонстрации кода получения различной информации.
Конкретная информация о передаче или информация в панели уведомлений, как обращаться с ней после ее получения и т. д., зависит от того, как вы договариваетесь с серверной частью.
Голосовое вещание
Это очень просто.
Просто используйте этот плагин, конфигурация конфигурации записывается в документ и все выходит
прямая трансляция
Я думаю, что это грубо разделено на два аспекта.
Во-первых, это создание собственного внутреннего push-сервера.
1. Пуш-приложение:
Вы можете прочитать статью этого друга Nuggets, я просил у него совета в свое время, и он мне много чего рассказал, но в итоге мы не стали делать стороннее решение для собственного живого сервера.
2. Прямая трансляция апплета:
Я только что прочитал документ, но не сделал этого позже.Его компонент pull stream не совпадает с приложением.
Второй — использовать готовые плагины и сервисы прямых трансляций, в основном Tencent Cloud.
1. Программа прямой трансляции приложения:
Мы нативный плагин, за который мы заплатили.У автора хорошее послепродажное обслуживание, отвечая на вопросы и поддерживая его на постоянной основе.
Первый быстрее начать, но это не настоящая прямая трансляция, это аудио и видео в реальном времени, и он не может выполнять такие функции, как запись экрана. Но нет абсолютно никаких проблем в том, чтобы просто воспроизвести картинку и получить звук, даже микрофон, красоту, отключение звука и так далее. Конкретная логика может быть выполнена в соответствии с вашим собственным бизнесом.Наш бизнес - это в основном программное обеспечение для лекций, не только прямая трансляция, но и функция подключения микрофона, которая очень подходит для наших нужд.
Второй компонент я не использовал, но он также выпущен для вашего ознакомления.
2. Прямая трансляция мини-программ На данный момент мы не планируем делать прямые эфиры в Mini Programs, потому что квалификации не хватает, но когда я смотрел плагин для прямых трансляций, я увидел очень хороший пример, и каждый может его посмотреть для справки.
Он превратил функцию апплета Tencent Video Cloud в версию uniapp, вы можете обратиться к ней.
Короче говоря, поддержка интеграции uniapp для стороннего SDK не очень хороша, или сторонний SDK не очень хорош для интеграции SDK uniapp?
20120 3.2 Обновление:
Разрешения приложения
Когда я вчера собирался, я обнаружил, что у моей камеры никогда не спрашивали разрешения использовать ее или нет, и она ответила мне напрямую, что она не авторизована. элементы конфигурации, но с этими элементами конфигурации многие не знакомы, поэтому я просто перерыл кучу соответствующих статей на форуме и посмотрел. Я нашел хорошую вещь, которая касается суждения и подсказки разрешений.
В приведенном выше содержании я писал о суждении о разрешениях на отправку приложений. Я не думаю, что он так хорошо написан, как другие, поэтому я просто изменил его на этот.
Здесь выдаются не только имена разрешений, но даже если вы настроите и упакуете его самостоятельно, вы можете использовать его для справки, и он также упакован в модуль.Очень удобно вызывать и запрашивать функциональные разрешения пользователя!
Я видел или использовал лучшие компоненты на рынке плагинов
Рекомендуется в произвольном порядке
colorUI Наши четыре проекта все основаны на colorUI.Это не библиотека компонентов, а библиотека стилей css.Единственный минус в том, что нет слишком подробной документации, но исходный код весь есть, и вы в принципе с ним знакомы .
===================================
uCharts — это высокопроизводительная перекрестная диаграмма, в которую включены в основном все типы диаграмм, и документация относительно ясна. Демонстрация также имеет исчерпывающий исходный код и может быть изменена в соответствии с вашими потребностями. Я также изменил исходный код код во время разработки, и использовать его очень легко.
===================================
Компонент рукописной подписи, удобный и простой в эксплуатации.
===================================
Шаблон ответа, этот шаблон ответа основан на colorUI, мне было лень писать его в то время, поэтому я переместил его напрямую.
доб. Только если cloud.net. может /plugin?ID=4…
===================================
Библиотека компонентов ThorUI Эта библиотека представляет собой серьезную библиотеку компонентов, которая содержит различные обычные компоненты.Мы также купили GraceUI.На самом деле, для сравнения, они в целом сопоставимы, и вы можете напрямую изменить исходный код, если у вас разные потребности.
===================================
Боковая навигация Впрочем, боковая навигация также относительно проста в реализации.Это компонент, который я видел.Посмотрел исходный код.Если его использовать на практике, то это хороший справочный объект.
===================================
Шаблон O2O local life Этот шаблон очень хорош для быстрой разработки проектов электронной коммерции.Авторские компоненты хорошо упакованы.Если вам это нужно, вы можете использовать его самостоятельно.
===================================
uni-версия mescroll — это компонент обновления и загрузки с подтягиванием, который работает в uni-приложении, в первом проекте он использовался, но потом я упаковал его сам, и это было бесполезно.
===================================
Пакет на основе интерфейса flyio
===================================
Мини-программа Tencent Cloud Аудио- и видеосвязь Uniapp Edition
Последнее слово
Обратите внимание на различия на каждом конце.Есть много вещей.Если лицом к h5, неправильно использовать реальную машину.Если реальная машина хороша, неправильно менять апплет.Есть различия между разными апплетами Короче говоря, рассматривайте разные ситуации, суть в том, чтобы внимательно читать документацию.
Хотя некоторые изначально достижимые функции могут быть не реализованы uniapp, в целом разработка довольно приятная. Многие ямки по-прежнему возникают из-за несовместимости с несколькими терминалами. Помимо того, что писать немного сложнее, есть в основном стратегии, которые можно решить.
Я также надеюсь, что uniapp будет становиться все лучше и лучше, и он будет становиться все более и более совершенным во всех аспектах, чтобы добавить козырь к выживанию для такого фермера, как я.