yarn add pinia
# or with npm
npm install pinia
import { createPinia } from 'pinia'
const pinia = createPinia()
pinia.use(SomePiniaPlugin) // 给 pinia 装插件
const app = createApp(App)
app.use(pinia)
更像原先的 vuex
// src/stores/counter.js
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counterStore', {
state: ()=> {
return {j: 0, k: 0}
}
})
// Counter.vue
import { useCounterStore } from 'path/to/src/stores/counterStore'
export default {
setup() {
const counterStore = useCounterStore()
// TODO 默认情况下可以直接这么更改,但是不推荐 // https://pinia.vuejs.org/core-concepts/state.html#accessing-the-state
counterStore.j ++
// 这里在视图里使用 counterStore.j 和 counterStore.k
// 但你不能解构 counterStore,只能像下面这样解构:
const { j, k } = storeToRefs(counterStore) // 注意:这里会自动忽略 方法 和 非响应式数据(Creates an object of references with all the state, getters, and plugin-added state properties of the store. Similar to toRefs() but specifically designed for Pinia stores so methods and non reactive properties are completely ignored.)
return {
counterStore, j, k,
}
},
}
getters 其实就是 store 的计算属性集合,而且 getter 不能是异步函数
export const useStore = defineStore('main', {
state: () => ({
counter: 0,
}),
getters: {
doubleCount(state) {
return state.counter * 2
},
doublePlusOne() {
return this.doubleCount + 1 // getter 访问另一个 getter 或者 state 可以用 this
},
getUserById: (state) => { // getter 可以返回一个函数,不过这会导致缓存失效
return (userId) => state.users.find((user) => user.id === userId)
},
otherGetter(state) { // 你还可以调用其他的 store
const otherStore = useOtherStore()
return state.localData + otherStore.data
},
},
})
// store.doubleCount 和 store.doublePlusOne 就可以直接当做属性使用了
// store.getUserById(userId) 可以当做函数使用
action 其实就是 store 的 methods,而且可以是异步函数
export const useUserStore = defineStore('users', {
state: () => ({
userData: null,
}),
actions: {
async getUser(token) {
this.userData = await api.post({ token })
},
},
})
// 然后你就可以使用 userStore.getUser(token) 了
推荐这种,符合Vue3 setup的编程模式,让结构更加扁平化
import { ref, computed } from 'vue';
import { defineStore } from 'pinia';
export const useUserStore = defineStore('users', () => {
const userData= ref({});
const getUser = async () => {
userData.value = await api.post({ token })
}
const userName = computed(() => userData.value.name)
return { userData, userName, getUser };
});
批量更新
counterStore.$patch(
{ name: 'pinia', age: counterStore.age + 1 }
)
cartStore.$patch((state) => {
state.items.push({ name: 'vuex', age: 18 })
state.hasChanged = true
})
用于监听 state 的整体变化。
cartStore.$subscribe((mutation, state) => {
// import { MutationType } from 'pinia'
mutation.type // 'direct' | 'patch object' | 'patch function'
mutation.storeId
mutation.payload // 获取 $patch 接收到的参数
localStorage.setItem('cart', JSON.stringify(state))
})
它有一个很方便的特性是会自动在组件卸载时注销,如果你不想要,可以在 $subscribe 第二个参数处传入
{detached: true}选项。
你也可以使用 watch 达到类似的效果:
watch(
pinia.state,
(state) => {
localStorage.setItem('piniaState', JSON.stringify(state))
},
{ deep: true }
)
用于监控所有 action 的执行情况。
const unsubscribe = someStore.$onAction(
({
name, // action 的名字
store, // store === someStore
args, // action 的实际参数
after, // action 成功之后执行 after
onError, // action 失败之后执行 onError
}) => {
const startTime = Date.now()
console.log(`开始执行 "${name}" 参数为 [${args.join(', ')}].`)
after((result) => {
console.log(
`执行成功 "${name}" 用时 ${Date.now() - startTime}毫秒\n结果为:${result}`
)
})
onError((error) => {
console.warn(
`执行失败 "${name}" 用时 ${Date.now() - startTime}毫秒\n报错为:${error}.`
)
})
}
)
// $onAction 会在它所在组件卸载时自动销毁
// 如果你将 $onAction 的第二个参数设置为 true,那么你需要自己调用 unsubscribe 来取消监听。
你可以使用 counterStore.$reset() 重置 state
// 下面两句代码都能覆盖原有 state
store.$state = { counter: 666, name: 'Paimon' }
pinia.state.value = {} // 这句常用在 SSR
三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应
起初:那不是错误区域的问题。在irb和数据库中,一切都很好。当我想在我的View中显示日期(created_at、updated_at和所有由我自己在每个模型中定义的日期)时,就会出现问题。我试图在application.rb中设置时区并从初始化程序中删除时间格式,但这并没有解决我的问题。Annotategem生成的架构信息:#created_at:datetime#updated_at:datetime#publish_at:datetime来自irb:1.9.2-p290:004>Time.zone=>(GMT+00:00)UTC1.9.2-p290:005>Time.zone.n
我想每10分钟执行一次cron作业,但我的系统只执行1小时。所以我正在寻找一种方法来做到这一点。我看过Timer和sleep但我不确定如何执行此操作,甚至不知道如何实现此操作。 最佳答案 看看http://rufus.rubyforge.org/rufus-scheduler/rufus-scheduler是一个用于调度代码片段(作业)的Rubygem。它了解在特定时间、在特定时间、每x次或仅通过CRON语句运行作业。rufus-scheduler不能替代cron/at,因为它在Ruby内部运行。
备份为250MB。我认为这不是很大,但问题似乎随着规模的增加而增加。从下面的备份gem登录。注意时间跨度;上传大约37分钟后,我收到了连接重置。[2015/10/3009:20:40][message]Storage::S3startedtransferring'2015.10.30.09.20.01.myapp_postgres.tar'tobucket'myapp-backups'.[2015/10/3009:57:06][error]ModelError:BackupforBackupPostgreSQL(myapp_postgres)Failed![2015/10/3009:5
是否有gem或其他东西来解析像“4h30m”“1d4h”这样的字符串——有点像JIRA或任务规划器中的估计,也许,国际化? 最佳答案 发布第二个答案,因为慢性(这是我最初的答案所建议的)不会给你时间跨度,而是时间戳。这是我的解析器。classTimeParserTOKENS={"m"=>(60),"h"=>(60*60),"d"=>(60*60*24)}attr_reader:timedefinitialize(input)@input=input@time=0parseenddefparse@input.scan(/(\d+)(\
出于惊人的目的,我尝试将作业安排为每5分钟运行一次的2分钟偏移。那就是我想要1个作业运行1,6,11,16..而另一个运行在2,7,12,17...我找不到执行此操作的示例。所以我尝试了:every5.minutes,:at=>1docommand"echo'youcanuserawcronsytaxtoo'"end这似乎可行,但所有“:at”示例看起来都期待字符串格式的时间。以上是否有效或恰好有效并且每个选项并不真正支持开始时间。 最佳答案 听起来这两个工作之间存在依赖关系,所以我认为有两种方法可以处理这个问题。如果你想在1、6、
我一直在墙上撞到墙上,试图获得与此PHP片段相当的JavaScript:我一直在尝试这一点:vartimeInMin=newDate().getTime()/60000;vartimestamp=Math.round(timeInMin);varkey=md5(timestamp+'uniqueID');利用MD5脚本这里我只需要锁定和钥匙才能匹配。对我来说似乎很简单。我究竟做错了什么?看答案正如我之前所说的,如果时间不匹配,它将不会产生相同的哈希。在这种情况下,我要做的是找到将时间从PHP转移到客户端的方法,以便他们可以使用相同的时间。php侧:客户端:vartimestamp=getCoo
我如何在Ruby中减去两个不同的UTC日期,然后得到以分钟为单位的差异?谢谢 最佳答案 如果减去两个Date或DateTime对象,结果是一个Rational表示它们之间的天数。你需要的是:a=Date.new(2009,10,13)-Date.new(2009,10,11)(a*24*60).to_i#2880minutes或a=DateTime.new(2009,10,13,12,0,0)-DateTime.new(2009,10,11,0,0,0)(a*24*60).to_i#3600minutes
有没有一种简单的方法可以将时间四舍五入到最接近的15分钟?这就是我目前正在做的事情。有更简单的方法吗?t=Time.newrounded_t=Time.local(t.year,t.month,t.day,t.hour,t.min/15*15) 最佳答案 您说的是“向下舍入”,所以我不确定您实际上是在寻找回合数还是底数,但这是执行这两项操作的代码。如果将round_off和floor方法添加到Time类,我认为这样的内容读起来真的很好。额外的好处是您可以更轻松地按任何时间分区舍入。require'active_support/cor
我有几秒钟。比方说270921。我如何显示该数字表示它是xx天、yy小时、zz分钟、ww秒? 最佳答案 可以使用divmod非常简洁地完成:t=270921mm,ss=t.divmod(60)#=>[4515,21]hh,mm=mm.divmod(60)#=>[75,15]dd,hh=hh.divmod(24)#=>[3,3]puts"%ddays,%dhours,%dminutesand%dseconds"%[dd,hh,mm,ss]#=>3days,3hours,15minutesand21seconds您可能可以通过使用col