์งํํ๋ ํ๋ก์ ํธ์์ LocalStorage๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๋ฐ์ดํฐ ๊ตฌ์ถ์ ํ๊ธฐ๋ก ํ๋ค.
๋ํ vue.js๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ํ๊ด๋ฆฌ๋ฅผ pinia๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ก ํ๋ค.
// ModbusMasterEthernet.vue
const setNetwork = () => {
networkData.value = {
protocol: selectedProtocol.value,
ip: inputedIp.value,
port: inputedPort.value,
transactionDelay: inputedTD.value,
timeout: inputedTO.value,
};
console.log(networkData.value);
};
ModbusMasterEthernet.vue์์ setNetwork๋ณ์์ ์ต๋ช ํจ์๊ฐ ์คํ๋์ ๋ networkData.value์ ๊ฐ์ ์ค์ ํ๋ค. ์ด ๊ฐ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ networkData๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
vuex ํน์ pinia ์ํ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Vue3์์ ์ถ์ฒํ๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Pinia๋ ๋ฉ์ธํ
์ด๋๊ฐ ์ง์ ์ถ์ฒํ๋ ์ํ๊ด๋ฆฌ ํด์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ฒ์ ์ตํ๋ณด์๋ค. ์ฌ์ฉํ๋ค๋ณด๋ฉด Composition API ์คํ์ผ๋ก ์์
ํ ๋ ์ ์ด์ธ๋ฆฌ๊ณ Vuex๋ณด๋จ ์์
๋์ด ์ ๋ค๋ ๋๋์ด ๋ ๋ค.
npm install pinia
// store.ts
import { createPinia, defineStore } from 'pinia';
const pinia = createPinia();
// Define store
export const useMyStore = defineStore('myStore', {
state: () => ({
networkMasterData: {} as NetworkMasterData,
}),
actions: {
setNetworkMasterData(this: NetworkMasterData, data: NetworkMasterData) {
this.networkMasterData = data;
},
},
});
export { pinia };
// NetworkMasterData type
export interface NetworkMasterData {
networkMasterData: NetworkMasterData;
protocol?: string;
ip?: string;
port?: number;
transactionDelay?: number;
timeout?: number;
}
// main.ts
import { createApp } from 'vue';
import App from './App.vue';
const app = createApp(App);
app.use(pinia);
app.mount('#app');
// ModbusMasterEthernet.vue
import { useMyStore } from '../store';
const myStore = useMyStore();
const setNetwork = () => {
const data = {
protocol: selectedProtocol.value,
ip: inputedIp.value,
port: inputedPort.value,
transactionDelay: inputedTD.value,
timeout: inputedTO.value,
};
myStore.setNetworkData(data);
console.log(myStore.networkMasterData);
์ฌ๊ธฐ๊น์ง ํ๋ฉด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ data๋ฅผ ์ธ ์ค๋น๊ฐ ์๋ฃ๋๋ค !
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ๋๋ data ๊ฐ์ ์ ์ฅ์ํค๊ธฐ ์ํด์ localstorage๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
๋, ์ ์ฅ๋๋ ๊ฐ์ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ์ ์ฅ์ํฌ ๊ฒ์ด๋ค.
// MME-Recent.vue
<script setup lang="ts">
import { onMounted, watchEffect } from 'vue';
import { useMyStore } from './store';
const myStore = useMyStore();
let savedData = ref<SettingType[]>([]);
// pinia store์ networkData ๋ณ๊ฒฝ ์ฌํญ ๊ฐ์ํ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด localStorage์ ์ ์ฅ
watchEffect(() => {
// ํ์ฌ pinia store์ ์๋ networkMasterData ๊ฐ์ ๋ณ์
const currentData = myStore.networkMasterData;
// currentData์ ์ฅ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ํธ์ํ๊ณ localStorage์ ์ ์ฅํ๊ธฐ ์ ์ ๋น ๊ฐ์ฒด์ธ์ง ํ์ธ (์๋ก๊ณ ์นจํ ๋ localStorage ํญ๋ชฉ์ ๋น ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ ๋ฐฉ์ง)
if (Object.keys(currentData).length > 0) {
try {
// string ํ์
์ด๋ฉด networkData ๊ฐ์ JSON์ผ๋ก ํ์ฑํ๊ณ , string์ด ์๋๋ผ๋ฉด ๋น ๋ฐฐ์ด์ ํ ๋น
const savedDataJSON = localStorage.getItem('networkMasterData');
savedData = typeof savedDataJSON === 'string' ? JSON.parse(savedDataJSON) : [];
console.log('savedData:', savedData.value);
// ์ถ๊ฐ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด์ ๋งจ ์์ ์ถ๊ฐ
savedData.unshift(currentData);
// ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฌธ์์ด๋ก ์ง๋ ฌํ
localStorage.setItem('networkMasterData', JSON.stringify(savedData));
} catch (error) {
// ์๋ฌ์ฒ๋ฆฌ
console.error('Error saving data to localStorage:', error);
}
}
});
</script>
์ฌ๊ธฐ์ ๋์ด ์๋, ํ์ด์ง๋ฅผ ์ฌ๋ก๋ฉํด๋ ํ
ํ๋ฆฟ์ด ํ๋ฉด์ ๋จ์์๋๋ก ํ๊ธฐ ์ํด ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ์ด์ง๋ฅผ ๋ก๋ํ ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ์ด๊ธฐํํ๋ค.
loadData ํจ์์ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ฐ์ดํฐ ๋ก๋: ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.
2. ๋ฐ์ดํฐ ์ด๊ธฐํ: ๊ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ณ์์ ํ ๋นํ๋ค.
3. ํ
ํ๋ฆฟ์ ๋ฐ์ดํฐ ํ์: ๋ณ์์ ํ ๋น๋ ๋ฐ์ดํฐ๋ฅผ ํ
ํ๋ฆฟ์์ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ํ์ํ๋ค.
<script setup lang="ts">
// ๋ฐ์ดํฐ ๋ก๋ ํจ์
const loadData = () => {
try {
const savedDataJSON = localStorage.getItem('networkMasterData');
if (savedDataJSON) {
savedData.value = JSON.parse(savedDataJSON);
}
} catch (error) {
console.error('Error loading data from localStorage:', error);
}
};
// ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ๋ฐ์ดํฐ ๋ก๋ ์คํ
onMounted(() => {
loadData();
});
</script>
<template>
<div v-for="(data, i) in savedData" :key="i" v-if="savedData && savedData.length > 0">
<q-card class="my-card bg-secondary text-white">
<q-card-section>
<div class="text-h6">{{ data.protocol }}</div>
<div class="text-subtitle2">{{ data.ip }}</div>
<div class="text-subtitle2">[Port] {{ data.port }}</div>
<div class="text-subtitle2">[Transaction Delay] {{ data.transactionDelay }}</div>
<div class="text-subtitle2">[Timeout] {{ data.timeout }}</div>
</q-card-section>
</template>
ํ ์คํธ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ํ๋ฉด !
๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ์ ์์ธ๋น.
์ง๊ธ๊น์ง ์ต๊ทผ ํญ๋ชฉ ์ ์ฅ์ ์ํด์ ์ด์ฌํ ํ๋ฉด์ ๋ฟ๋ ค์ฃผ์๋ค !!
<script setup lang="ts">
import { ref, watchEffect, onMounted } from 'vue';
import { useMyStore } from '../store/store';
import { useToggleStore } from '../store/modules/settingtoggle';
const deleteCard = (index: number) => {
// savedData ๋ฐฐ์ด์์ ์ ํ๋ ํญ๋ชฉ์ผ๋ก๋ถํฐ 1๊ฐ ์ญ์
savedData.value.splice(index, 1);
// ํด๋น ๋ก์ปฌ ์ ์ฅ์ ๊ฐ๋ ์ ๊ฑฐ
const savedDataJSON = localStorage.getItem('networkMasterData');
if (savedDataJSON) {
const parsedData = JSON.parse(savedDataJSON) as SettingType[];
parsedData.splice(index, 1);
localStorage.setItem('networkMasterData', JSON.stringify(parsedData));
}
};
const openCard = () => {
const toggleStore = useToggleStore();
toggleStore.falseSetting();
}
</script>
<template>
<div v-for="(data, i) in savedData" :key="i">
<q-card class="my-card bg-secondary text-white">
<q-card-section>
<div class="text-h6">{{ data.protocol }}</div>
<div class="text-subtitle2">{{ data.ip }}</div>
<div class="text-subtitle2">[Port] {{ data.port }}</div>
<div class="text-subtitle2">[Transaction Delay] {{ data.transactionDelay }}</div>
<div class="text-subtitle2">[Timeout] {{ data.timeout }}</div>
</q-card-section>
<q-separator dark />
<q-card-actions>
<q-btn flat @click="deleteCard(i)">Delete</q-btn>
<router-link to="/Modbus/MasterEthernet"><q-btn flat @click="openCard">Open</q-btn></router-link>
</q-card-actions>
</q-card>
</div>
</template>