Vue 状态管理 Pinia 在UNI-APP下使用说明
<h1><span style="color: rgba(255, 0, 0, 1)">状态管理 Pinia</span></h1><p><span style="color: rgba(0, 0, 255, 1)">此功能和VUEX类似,局有全站通用状态共享的特性。</span></p>
<p>在 HBuilder X 下不需要安装,直接使用即可,步骤如下:</p>
<p><strong>第一步:在 main.js 中引入插件:</strong></p>
<div class="cnblogs_code">
<pre>import { createSSRApp } from 'vue'<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(255, 0, 0, 1)"><strong>import </strong></span></span><span style="color: rgba(255, 0, 0, 1)"><strong>* as Pinia from 'pinia'</strong></span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><strong>;</strong></span>
export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> createApp() {
const app </span>=<span style="color: rgba(0, 0, 0, 1)"> createSSRApp(App);
<strong><span style="color: rgba(255, 0, 0, 1)">app.use(Pinia.createPinia());
</span></strong></span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
app,
Pinia, </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 此处必须将 Pinia 返回</span>
<span style="color: rgba(0, 0, 0, 1)"> };
}</span></pre>
</div>
<p> </p>
<p><strong>第二步:编写共享状态代码,模板如下:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> stores/counter.js</span>
import { defineStore } from 'pinia'<span style="color: rgba(0, 0, 0, 1)">;
<br><strong><span style="color: rgba(255, 0, 0, 1)">// 这里的 counter 似乎没有作用,可以更换成任意名称。</span></strong>
export const useCounterStore </span>= defineStore('counter'<span style="color: rgba(0, 0, 0, 1)">, {<br> <span style="color: rgba(255, 0, 0, 1)"><strong>// 定义要状态数据</strong></span>
state: () </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> { count: 0<span style="color: rgba(0, 0, 0, 1)"> }; <strong><span style="color: rgba(255, 0, 0, 1)">// 这里可以放入多个共享数据,比如: {count: 0, operator: '+'}</span></strong>
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 也可以这样定义</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> state: () => ({ count: 0 })<br> <strong><span style="color: rgba(255, 0, 0, 1)">// 定义方法</span></strong></span>
<span style="color: rgba(0, 0, 0, 1)"> actions: {
increment() {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
},
},
});</span></pre>
</div>
<p> </p>
<p><strong>第三步:在页面中调用共享数据:</strong></p>
<div class="cnblogs_code">
<pre>import { useCounterStore } from '@/stores/counter'<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
setup() {
<span style="color: rgba(255, 0, 0, 1)"><strong>const counter </strong></span></span><span style="color: rgba(255, 0, 0, 1)"><strong>=</strong></span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><strong> useCounterStore();</strong>
<strong>// 它的赋值与取值比VUEX更方便,同时值也是响应式的</strong></span>
counter.<span style="color: rgba(255, 0, 0, 1)"><strong>count</strong></span></span>++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 或者使用方法修改数据 actions</span>
<span style="color: rgba(0, 0, 0, 1)"> counter.increment();
},
};</span></pre>
</div>
<p> </p>
<p>示例:</p>
<p><img src="https://img2022.cnblogs.com/blog/1383473/202209/1383473-20220921204315174-1491363736.png"></p>
<p> </p>
<p> </p>
<p>/stores/counter.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">import {
defineStore
} from </span>'pinia'<span style="color: rgba(0, 0, 0, 1)">;
export const useCounterStore </span>= defineStore('counter'<span style="color: rgba(0, 0, 0, 1)">, {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 定义要状态数据</span>
state: () =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
count: </span>0<span style="color: rgba(0, 0, 0, 1)">,
operator: </span>'+'<span style="color: rgba(0, 0, 0, 1)">
};
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 定义与状态数据相关的方法</span>
<span style="color: rgba(0, 0, 0, 1)"> actions: {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 计算</span>
<span style="color: rgba(0, 0, 0, 1)"> calculation(x){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.operator==='+'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.add(x)
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.operator==='-'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.reduce(x)
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.operator==='*'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.ride(x)
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.operator==='/'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.division(x)
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 乘</span>
<span style="color: rgba(0, 0, 0, 1)"> ride(x) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count *=<span style="color: rgba(0, 0, 0, 1)"> x
console.log(</span>456<span style="color: rgba(0, 0, 0, 1)">);
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 除</span>
<span style="color: rgba(0, 0, 0, 1)"> division(x){
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count /= x
<span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 加</span>
<span style="color: rgba(0, 0, 0, 1)"> add(x) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count +=<span style="color: rgba(0, 0, 0, 1)"> x
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 减</span>
<span style="color: rgba(0, 0, 0, 1)"> reduce(x) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count = <span style="color: rgba(0, 0, 255, 1)">this</span>.count -<span style="color: rgba(0, 0, 0, 1)"> x
}
},
});</span></pre>
</div>
<p> </p>
<p>index.vlue</p>
<div class="cnblogs_code">
<pre><template>
<uni-easyinput v-model="number" type="number" inputBorder placeholder="请输入数字">
</uni-easyinput>
<uni-data-checkbox v-model="counterStore.operator" :localdata="selectConfig" mode="tag">
</uni-data-checkbox>
<view><span style="color: rgba(0, 0, 0, 1)">
计算结果:{{js}}</span><br />
{{number}} {{counterStore.operator}} 5 =<span style="color: rgba(0, 0, 0, 1)"> {{counterStore.count}}
</span></view>
</template>
<script setup><span style="color: rgba(0, 0, 0, 1)">
import {
ref,
computed
} from </span>'vue'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ 一。它是响应式的</span>
<span style="color: rgba(0, 0, 0, 1)"> import {
useCounterStore
} from </span>'@/stores/counter.js'
<span style="color: rgba(0, 0, 255, 1)">var</span> counterStore =<span style="color: rgba(0, 0, 0, 1)"> useCounterStore()
const selectConfig </span>=<span style="color: rgba(0, 0, 0, 1)"> [{
</span>"value": "+"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "加法"<span style="color: rgba(0, 0, 0, 1)">
}, {
</span>"value": "-"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "减法"<span style="color: rgba(0, 0, 0, 1)">
}, {
</span>"value": "*"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "乘法"<span style="color: rgba(0, 0, 0, 1)">
}, {
</span>"value": "/"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "除法"<span style="color: rgba(0, 0, 0, 1)">
}]
const number </span>= ref(0<span style="color: rgba(0, 0, 0, 1)">)
const js </span>= computed(() =><span style="color: rgba(0, 0, 0, 1)"> {
counterStore.operator
counterStore.count </span>=<span style="color: rgba(0, 0, 0, 1)"> parseFloat(number.value)
counterStore.calculation(</span>5<span style="color: rgba(0, 0, 0, 1)">)
})
</span></script></pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/wm218/p/16717051.html
頁:
[1]