Grace
Компактная и простая в использовании вспомогательная библиотека для разработки апплетов WeChat.
Github: GitHub.com/Temperature/Конечно, переменный ток…
Функции
- Легкий, компактный и простой в использовании
- Поддерживает скорость реагирования на данные так же элегантно, как Vue
- Поддержка автоматического обновления данных, кэша изменений, пакетного обновления
- Мощная сетевая функция
- Поддержка глобальной шины событий
- Поддержка передачи значений между страницами
- Поддержка миксинов
Demo
Пример проекта находится в каталоге «quickstart-grace-demo» исходного кода и может быть открыт с помощью инструмента разработки апплета WeChat.
использовать
- Скопируйте все файлы из каталога src в проекте https://github.com/wendux/grace в каталог Grace в корневом каталоге апплета.
- при создании страницы
grace.page
заменятьPage
Вот и все.
import grace from "../../grace/index.js"
grace.page({
data: {
userInfo: {},
canIUse: true
},
onLoad() {
//直接通过$data赋值更新数据
this.$data.canIUse = false
//通过$http发起网络请求
this.$http.post("http://www.dtworkroom.com/doris/1/2.0.0/test", {xx: 7}).then((d) => {
console.log(d)
}).catch(err => {
console.log(err.status, err.message)
})
//全局事件总线-监听事件
this.$bus.$on("enventName", (data) => {
console.log(data)
})
//返回上一页,并传递数据
this.$goBack({retValue: "8"})
},
//跨页面传值
$onBackData(data) {
//接收页面返回的数据,
}
...
})
Если это зарегистрированный компонент (компонент), просто используйтеgrace.component
заменятьComponent
Конструктор может:
// grace.component 替换 Component
grace.component({
properties: {
},
data: {
text:"我是自定义组件",
times:1
},
methods: {
onTap(){
//赋值更新
this.$data.text="自定义组件点击 +"+this.$data.times++
}
}
}
Примечание. Все имена методов и свойств, которые Грейс внедряет в экземпляры, начинаются с «$».
данные реагируют
После изменения данных в апплете WeChat их необходимо явно обновить через setData, например:
//更新单个字段
this.setData({
userInfo: res.userInfo
})
//更新多个字段
this.setData({
userInfo: res.userInfo
canIUse: false
})
На это явно повлиял React.Хорошо его не учить🤦, если вы использовали Vue, вам должно показаться, что это выглядит очень неэлегантно, особенно когда в коде много разрозненных значений, которые нужно обновить, Код будет выглядеть избыточно, и, иногда, чтобы изменить переменную, нужно вызвать ее один разsetData
.
Теперь с помощью Grace ваш код становится элегантным, и вы можете обновлять данные так же, как в Vue:
this.$data.userInfo=res.userInfo;
//更新多个字段,并非重新赋值
this.$data={
userInfo: res.userInfo
canIUse: false
}
Теперь вы можете обновить интерфейс напрямую, назначив его. Конечно, вы все еще можете использоватьthis.setData
для обновления данных Грейс автоматически синхронизируетсяthis.$data
.
Обнаружение обновления массива
Принцип благодати, реагирующий на данные, такой же, как и у Vue (если вы знакомы с Vue, можете его пропустить) для массивов:
Метод мутации
Grace содержит набор модифицирующих методов для наблюдения за массивами, поэтому они также будут запускать обновления представлений. Эти методы следующие:
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
заменить массив
Методы мутации, как следует из названия, мутируют исходный массив, который был вызван этими методами. Напротив, существуют также немутирующие методы, такие как:filter()
, concat()
иslice()
. Они не изменяют исходный массив, новсегда возвращает новый массив. При использовании немутирующего метода вы можете заменить старый массив новым:
this.$data.items = this.$data.items.filter(function (item) {
return item.message.match(/Foo/)
})
Меры предосторожности
Из-за ограничений JavaScript, благодать не может обнаружить следующие изменяющиеся массивы:
- Когда вы используете индекс для прямой установки элемента, например:
this.$data.items[indexOfItem] = newValue
- Когда вы изменяете длину массива, например:
this.$data.items.length = newLength
Чтобы решить первый тип проблемы, можно достичь следующих двух способов:this.$data.items[indexOfItem] = newValue
Тот же эффект также вызовет обновление состояния:
this.$data.$set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
this.$data.items.splice(indexOfItem, 1, newValue)
Для решения второго типа задач можно использоватьsplice
:
this.$data.items.splice(newLength)
Добавление свойств объекта
Или из-за ограничений JavaScript,благодать не может обнаружить добавление или удаление свойств объекта:
grace.page({
data: {
a: 1
}
onLoad(){
//a现在是响应式的
this.$data.a=2;
//b不是响应式的
this.$data.b = 2
}
})
Grace не может динамически добавлять реактивные свойства корневого уровня к уже созданным экземплярам. Однако вы можете использовать$data.$set(object, key, value)
метод для добавления реактивных свойств к вложенным объектам. Например:
this.$data.$set(this.$data, 'b', 2)
кеш изменения данных
Согласно WeChatМини-программа Официальные предложения по оптимизации, благодать может избежать следующих проблем:
-
Часто заходите в setData
Чтобы решить эту проблему, в Grace вводится механизм кэширования изменений данных, рассмотрим пример:
//开始缓存数据变更 this.$data.$cache(); //接下来是n次密集的数据更新 this.$data.name="doris" this.$data.userCard.no="610xxx889" this.$data.balance=66666 .... //统一提交变更 this.$data.$commit();
вызов
$cache()
После этого все изменения данных будут кэшироваться (не срабатыватьsetData
), умейте звонить$commit
После этого он будет обновляться равномерно, что позволяет избежать частых вызовов.setData
потребление производительности. -
Страница фонового состояния для setData
Когда страница переходит в фоновое состояние (не видна пользователю), она не должна продолжаться.
setData
, отображение страницы фонового состояния пользователем не ощущается. Кроме того, страница фонового состояния переходит наsetData
Также вытесняет выполнение страницы переднего плана. Когда страница переходит в фоновый режим, грейс автоматически останавливает обновление данных, а когда страница снова выходит на передний план, она автоматически начинает рендеринг.
Http
Grace инкапсулирует wx.request через Promise и поддерживает перехватчики, настройку запросов и т.д.:
-
Restful API
$http.get(url, [data], [options]) $http.post(url, data, [options]) $http.put(url, data, [options]) $http.delete(url,[data],[options]) $http.patch(url,[data],[options])
-
несколько одновременных запросов
var getUserRecords=()=>{ return this.$http.get('/user/133/records'); } var getUserProjects=()=>{ return this.$http.get('/user/133/projects'); } this.$http.all([getUserRecords(), getUserProjects()]) .then(this.$http.spread(function (records, projects) { // Both requests are now complete })) .catch(function(error){ console.log(error) })
-
перехватчик
// Add a request interceptor this.$http.interceptors.request.use((config,promise)=>{ // Do something before request is sent config.headers["X-Tag"]="grace"; // Complete the request with custom data // promise.resolve("fake data") return config; }) // Add a response interceptor this.$http.interceptors.response.use( (response,promise) => { // Do something with response data . // Just return the data field of response return response.data }, (err,promise) => { // Do something with response error //promise.resolve("ssss") } )
Библиотека HTTP-запросов, используемая Грейс,FLY , $http
даFLYЭкземпляр , пожалуйста, обратитесь к его официальному веб-сайту за подробностями, если вы хотите создать новыйFLYПример:
var newHttp=grace.createHttpClient();
Примечание. Когда Грейс создает страницу, все страницы$http
все так жеFLYэкземпляр, так правильноthis.$http
Конфигурация будет действовать глобально, поэтому, если вы хотите настроить глобальный перехватчик, запросить базовый адрес, время ожидания и т. д., вы можете создать файл справки, а затем импортировать этот файл на страницу:
import grace from "../grace/index.js"
grace.http.config.baseURL = 'http://www.dtworkroom.com/doris/1/2.0.0/'
grace.http.config.timeout = 5000;
grace.http.interceptors.request.use((config, promise) => {
//拦截器逻辑
//console.log(config.body);
});
export default grace;
автобус событий
Глобальная шина событий может инициировать и прослушивать события глобально (на разных страницах).
$on(eventName,handler)
прослушать событие
this.$bus.$on("enventName",(arg1,arg2)=>{
//事件处理器参数为$emit触发事件时传递的参数
console.log(arg1)
})
$emit(имя_события,[…аргументы])
триггерное событие
this.$bus.$emit("enventName", 1,2)
$off(eventName,[handler])
отменить прослушивание
this.$bus.$off("eventName",cb)
Когда обработчик предоставляется, из очереди прослушивателя удаляется только обработчик. Если обработчик не передается, очередь прослушивателя для события очищается.
Передача значений по страницам
При открытии новой страницы в апплете вы можете передать значение новой странице через URL-запрос, что очень просто, например:
wx.navigateTo({
//传递id,在新页面onLoad中获取
url: 'test?id=1'
})
Но как мне вернуть данные на предыдущую страницу, когда новая страница закрыта? В апплете нет прямого метода. Grace добавляет обратный вызов ко всем страницам для получения данных, возвращаемых страницей, следующим образом:
grace.page({
data:{}
$onBackData(data){
//接收页面返回的数据,
}
...
})
Вышеупомянутая страница записана как A. Предположим, вы открываете новую страницу B, вам нужно выбрать некоторую информацию в B и отправить ее обратно в A, тогда вы должны:
grace.page({
data: {},
bindViewTap(){
//返回上一个页面,并回传一些数据
this.$goBack({xxx:5});
}
...
}
$goBack([data],[delta])
Закрыть текущую страницу и вернуться на предыдущую страницу или многоуровневую страницу, если таковая имеетсяdata
, он вызовет возвращаемую страницу$onBackData
обратный звонок, еслиdata
Если он не существует, он не перезвонит$onBackData
.
delta
то же самое значениеwx.navigateBack
Дельта параметра представляет собой количество страниц для отката, по умолчанию 1 (предыдущая страница), если дельта больше, чем количество существующих страниц, произойдет возврат на домашнюю страницу.
mixin
Миксины — это очень гибкий способ распространения повторно используемой функциональности Страницы. Короче говоря, он может смешивать параметры страницы, когда апплет создает страницы, а может добавлять какие-то хуки на все страницы, если вы этого не понимаете, не волнуйтесь, давайте рассмотрим пример:
Реализация: вызов на любой страницеonLoad
,onShow
Когда журнал печатается, выводится текущий идентификатор страницы.
-
Создайте файл help.js
import grace from "../grace/index.js" var page=grace.page; grace.page=function(ob){ mixin(ob,{ onLoad(){ //页面调用onShow时打印出当前页面id console.log("onLoad, pageID:"+this.$id) }, onShow(){ //页面调用onShow时打印出当前页面id console.log("onShow, pageID:"+this.$id) } }) //创建页面 page.call(grace,ob) } export default grace;
-
Внедрите help.js при создании страницы
import grace from "../../utils/help.js" grace.page({ data:{} }) //控制台输出 > onLoad, pageID:1 > onShow, pageID:1
Таким образом, это эквивалентно добавлению на все страницыonLoad
,onShow
предварительная обработка.
Видно, что миксин добавляет к странице унифицированную функцию предварительной обработки, смешивая параметры создания страницы, что эквивалентно добавлению страничного хука.
вариант слияния
Когда объект сборки страницы и объект миксина имеют параметры с одинаковыми именами, эти параметры будут соответствующим образом смешаны.
-
Объект данных будет неглубоко объединен внутри (один уровень глубины атрибута), и данные объекта сборки страницы будут иметь приоритет, если они конфликтуют с объектом номера сборки страницы.
-
Хуки-функции с одинаковыми именами будут смешаны в массив, поэтому будут вызываться все. Кроме того, хук смешанного объекта будет цепляться за саму страницу.Доперечислить.
grace.mixin(ob,{ onShow(){ console.log("mixin onShow") } }); ... grace.page({ onShow(){ console.log("page onShow") } }) //页面显示时会输出: > mixin onShow > page onShow
Сравните с Wepy
Пожалуйста, обратитесь к: https://juejin.cn/post/6844903571264110606
Наконец
Опубликуйте адрес github еще раз, если вам это нравится, добро пожаловать в звезду, Github:GitHub.com/Temperature/Конечно, переменный ток…