Сохранение значений в localstorage #4
This commit is contained in:
@@ -13,16 +13,28 @@
|
|||||||
<script>
|
<script>
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { flipCoin } from '@/utils/random'
|
import { flipCoin } from '@/utils/random'
|
||||||
|
import { loadFormState, saveFormState } from '@/utils/persistForm'
|
||||||
|
|
||||||
|
const STORAGE_KEY = 'coin'
|
||||||
|
const DEFAULTS = {
|
||||||
|
count: 1
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CoinGenerator',
|
name: 'CoinGenerator',
|
||||||
emits: ['result'],
|
emits: ['result'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return loadFormState(STORAGE_KEY, DEFAULTS)
|
||||||
count: 1
|
},
|
||||||
}
|
watch: {
|
||||||
|
count: 'persist'
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
persist() {
|
||||||
|
saveFormState(STORAGE_KEY, {
|
||||||
|
count: this.count
|
||||||
|
})
|
||||||
|
},
|
||||||
onGenerate() {
|
onGenerate() {
|
||||||
if (this.count < 1) {
|
if (this.count < 1) {
|
||||||
ElMessage.error('Количество должно быть не меньше 1')
|
ElMessage.error('Количество должно быть не меньше 1')
|
||||||
|
|||||||
@@ -23,16 +23,20 @@
|
|||||||
<script>
|
<script>
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { generateFromList } from '@/utils/random'
|
import { generateFromList } from '@/utils/random'
|
||||||
|
import { loadFormState, saveFormState } from '@/utils/persistForm'
|
||||||
|
|
||||||
|
const STORAGE_KEY = 'list'
|
||||||
|
const DEFAULTS = {
|
||||||
|
rawList: 'яблоко\nбанан\nвишня\nгруша\nдыня',
|
||||||
|
count: 1,
|
||||||
|
unique: false
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ListGenerator',
|
name: 'ListGenerator',
|
||||||
emits: ['result'],
|
emits: ['result'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return loadFormState(STORAGE_KEY, DEFAULTS)
|
||||||
rawList: 'яблоко\nбанан\nвишня\nгруша\nдыня',
|
|
||||||
count: 1,
|
|
||||||
unique: false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
items() {
|
items() {
|
||||||
@@ -42,7 +46,19 @@ export default {
|
|||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
rawList: 'persist',
|
||||||
|
count: 'persist',
|
||||||
|
unique: 'persist'
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
persist() {
|
||||||
|
saveFormState(STORAGE_KEY, {
|
||||||
|
rawList: this.rawList,
|
||||||
|
count: this.count,
|
||||||
|
unique: this.unique
|
||||||
|
})
|
||||||
|
},
|
||||||
onGenerate() {
|
onGenerate() {
|
||||||
if (!this.items.length) {
|
if (!this.items.length) {
|
||||||
ElMessage.error('Список пуст — добавьте хотя бы одно значение')
|
ElMessage.error('Список пуст — добавьте хотя бы одно значение')
|
||||||
|
|||||||
@@ -21,19 +21,37 @@
|
|||||||
<script>
|
<script>
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { generateRange } from '@/utils/random'
|
import { generateRange } from '@/utils/random'
|
||||||
|
import { loadFormState, saveFormState } from '@/utils/persistForm'
|
||||||
|
|
||||||
export default {
|
const STORAGE_KEY = 'range'
|
||||||
name: 'RangeGenerator',
|
const DEFAULTS = {
|
||||||
emits: ['result'],
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
min: 1,
|
min: 1,
|
||||||
max: 100,
|
max: 100,
|
||||||
count: 5,
|
count: 5,
|
||||||
unique: false
|
unique: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'RangeGenerator',
|
||||||
|
emits: ['result'],
|
||||||
|
data() {
|
||||||
|
return loadFormState(STORAGE_KEY, DEFAULTS)
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
min: 'persist',
|
||||||
|
max: 'persist',
|
||||||
|
count: 'persist',
|
||||||
|
unique: 'persist'
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
persist() {
|
||||||
|
saveFormState(STORAGE_KEY, {
|
||||||
|
min: this.min,
|
||||||
|
max: this.max,
|
||||||
|
count: this.count,
|
||||||
|
unique: this.unique
|
||||||
|
})
|
||||||
|
},
|
||||||
onGenerate() {
|
onGenerate() {
|
||||||
if (this.min > this.max) {
|
if (this.min > this.max) {
|
||||||
ElMessage.error('Минимум не может быть больше максимума')
|
ElMessage.error('Минимум не может быть больше максимума')
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
const PREFIX = 'irandom:form:'
|
||||||
|
|
||||||
|
function readStored(key, defaults) {
|
||||||
|
try {
|
||||||
|
const raw = localStorage.getItem(PREFIX + key)
|
||||||
|
if (!raw) {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
const parsed = JSON.parse(raw)
|
||||||
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const out = {}
|
||||||
|
for (const field of Object.keys(defaults)) {
|
||||||
|
if (!Object.prototype.hasOwnProperty.call(parsed, field)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (typeof parsed[field] !== typeof defaults[field]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out[field] = parsed[field]
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
} catch {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge defaults with values previously saved in localStorage.
|
||||||
|
*/
|
||||||
|
export function loadFormState(key, defaults) {
|
||||||
|
return {
|
||||||
|
...defaults,
|
||||||
|
...readStored(key, defaults)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persist form fields (not results) to localStorage.
|
||||||
|
*/
|
||||||
|
export function saveFormState(key, state) {
|
||||||
|
try {
|
||||||
|
localStorage.setItem(PREFIX + key, JSON.stringify(state))
|
||||||
|
} catch {
|
||||||
|
// ignore quota / private mode
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user