作者: admin

  • pinia笔记

    pinia中action支持同步和异步
    pinia中只有state、getter、action,抛弃了Vuex中的Mutation
    pinia中每个store都是独立的,互相不影响

     

    安装

    npm install pinia -S

     

    引入,编辑main.js

    import { createPinia } from "pinia";
    const pinia = createPinia();
    
    const app = createApp(App);
    app.use(pinia);

     

    创建store
    \src\store\test.js
    import { defineStore } from 'pinia'
    
    export const usersstore = defineStore('users', {
        state: () => {
            return {   //state的值定义一定要这么写
                name: "111小猪课堂",
                age: 25,
                sex: "男",
            };
        },
        getters: {
            getAddAge: (state) => {
              return state.age + 100;
            },
        },
        actions: {
            saveName(name) {
              this.name = name; //修改state的name值
            },
        },
    })

     

    state

    <div>{{age}}</div>
    <button @click="changebtn">点击</button>
    import {usersstore} from "@/store/test";
    
    //调用:
    var {name,age,sex} = usersstore()
    var age = ref(age)
    
    
    //修改数据不响应
    var changebtn = ()=>{
      usersstore().age=usersstore().age+1  //数据修改成功,但不响应
      console.log(usersstore())
    }
    
    //推荐,修改数据可以响应
    import {storeToRefs} from 'pinia'
    var {name,age,sex} = storeToRefs(usersstore()) //在外面包裹一层storeToRefs,
    var age = ref(age)
    usersstore().age=usersstore().age+1  //数据修改成功,同时也能响应
    
    
    //批量修改数据
    var changebtn = ()=>{
        usersstore().$patch({  //缺点就是不需要修改的数据也要写出来
          name: "111小猪课堂",
          age: 29,
          sex: "男",
        })
        
        usersstore().$patch((state) => { //这样就可以修改只想改的部分了
          state.age=state.age+1
          state.sex="女"
        })
        
        usersstore().$state = { counter: 666, name: '张三' } //替换整个state数据         
    }
    
    
    
    var changebtn = ()=>{
      usersstore().$reset(); //重置所有数据
    }

     

     

    getters

    export const usersstore = defineStore('users', {
        state: () => {
            return {   //state的值定义一定要这么写
                name: "111小猪课堂",
                age: 25,
                sex: "男",
            };
        },
        getters: {
            getAddAge: (state) => { //相当于在state新增了一个getAddAge变量
              return state.age + 100;
            },
            getNameAndAge: (state) => {
              return this.name + this.getAddAge; // 调用其它getter
            },
        },
    })

     

    接收外来参数

    getters: {
            getAddAge: (state) => { //相当于在state新增了一个getAddAge变量
              return (num) => state.age + num;
            }
    },
    
    调用
    {{ usersstore().getAddAge(2) }}

     

     

    actions
    actions: {
            saveName(name) {
              this.name = name; //修改state的name值
            },
    },

     

    调用

    // 调用actions方法
    const saveName = () => {
      usersstore().saveName("我是小猪");
    };

     

     

    createPinia //初始化创建pinia
    defineStore //创建store
    storeToRefs //修改store数据实现数据响应
    state //理解成data
    store.$reset(); //初始化数据
    store.$patch //批量修改数据
    store.$state //直接替换state数据
    getter //理解成computed
    它的作用就是返回一个新的结果,既然它和Vue中的计算属性类似,那么它肯定也是会被缓存的,就和computed一样。
    actions //理解成methods ,支持调用同步、异步方法

     

     

    数据持久化

    也就是vuex把数据存到localStorage中

    npm i pinia-plugin-persistedstate -S

     

    \src\store\index.js

    import { createPinia } from "pinia";
    const pinia = createPinia();
    import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
    
    
    pinia.use(piniaPluginPersistedstate)
    
    export default pinia

     

    \src\store\user.js

    .
    .
    .
    state: () => {
        return {
            token: getToken(),
            menus: [],
        };
    },
    getters: {
      
    },
    actions: {
       
    },
    // persist:true, //将全部数据缓存到localStorage
    persist: {
        // 自定义字段名
        key: 'mychannel',
        // 只是将token字段持久化存储
        paths: ['token']
    }

     

     

     

     

    https://zhuanlan.zhihu.com/p/533233367

  • echarts的tooltip超出屏幕可视范围

    解决前

     

    解决后

     

    tooltip: {
       position: function (point, params, dom, rect, size) {
                 // 获取可视区域的宽度和高度
                 const viewWidth = size.viewSize[0];
                 const viewHeight = size.viewSize[1];
    
                 // 获取提示框内容的宽度和高度
                 const tooltipWidth = dom.offsetWidth;
                 const tooltipHeight = dom.offsetHeight;
    
                 // 设置提示框的位置
                 let left = point[0];
                 let top = point[1];
    
                 // 判断提示框是否超出可视范围,如果超出则调整位置
                 if (left + tooltipWidth > viewWidth) {
                   left = viewWidth - tooltipWidth;
                 }
                 if (top + tooltipHeight > viewHeight) {
                   top = viewHeight - tooltipHeight;
                 }
    
                 return [left, top];
               },
    }

     

    tooltip 的浮窗要可以点击

    tooltip: {
               position: function (point,params,dom,rect,size) {
                 var x = 0;//x坐标位置
                 var y = 0;//y坐标位置
    
                 //当前鼠标位置
                 var pointX = point[0];
                 var pointY = point[1];
    
                 //提示框大小
                 var boxWidth = size.contentSize[0];
                 var boxHight = size.contentSize[1];
    
                 //说明鼠标左边放不下提示框
                 if(boxWidth > pointX){
                   x = 5;
                 }else{//左边下一点
                   x = pointX - boxWidth;
                 }
                 //说明鼠标上边放不下提示框
                 if(boxHight > pointY){
                   y = 5;
                 }else{//上边下一点
                   y = pointY - boxHight;
                 }
    
                 return [x,y];
               },
               trigger: "item",
               enterable: true,
    }

     

     

     

  • vue引入echarts

    echars 5.0之前引入用

    import echarts from 'echarts' //引入echarts

     

    echars 5.0之后引入用

    import * as echarts from 'echarts' //引入echarts

     

    vue2 echarts组件

    <template>
       <div>
         <div id="main" ref="mycharts" class="chatscss"></div>
       </div>
    </template>
    
    <script>
    import echarts from 'echarts'  //引入echarts 4.8.0
    export default {
      props:['sourceData'],
      name: "echart",
      data(){
        return{
          initmycharts:null
        }
      },
      mounted() {
        this.$nextTick(()=>{
          this.init()
        })
      },
      watch:{
        sourceData:{
          handler: function (val, oldVal) {
           this.init()
          }, //不要使用箭头函数,否则this无法指向vue对象
          deep: true  //遇到对象或者复合结构要开启深度监听,简单数组不需要开启
        },
      },
      methods:{
        init(){
          var chartDom = document.getElementById('main');
          this.initmycharts = echarts.init(chartDom);
          var option;
    
          option = {
            xAxis: {
              type: 'category',
              data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
            },
            yAxis: {
              type: 'value'
            },
            series: [
              {
                data: this.sourceData,//[150, 230, 224, 218, 135, 147, 260],
                type: 'line'
              }
            ]
          };
    
          option && this.initmycharts.setOption(option);
          window.addEventListener('resize', ()=>{
            this.initmycharts.resize()
          })
        }
      }
    }
    </script>
    
    <style scoped>
      .chatscss{
        height: 400px;width: 100%
      }
    </style>

     

    调用:

    <myecharts :sourceData="testData"></myecharts>
    
    testData:[150, 230, 224, 218, 135, 147, 860],
    
    mounted() {
        
      setTimeout(()=>{
        this.testData = [150, 230, 224, 218, 135, 147, 60]
      },2000)
      
    }

     

     

    vue3 组件

    <template>
      <div id="main" class="mycharts" ref="mycharts"></div>
    </template>
    
    <script setup>
    import * as echarts from 'echarts'; //引入 5.5.0
    import {effectScope,computed,ref,watch,watchEffect,reactive,watchPostEffect,getCurrentScope,onScopeDispose,defineOptions,onMounted,nextTick} from 'vue'
    
    const mycharts = ref(null)
    var init = ()=>{
    
      var myChartdom = echarts.init(mycharts.value);
      var option = {
        title: {
          text: 'ECharts 入门示例'
        },
        tooltip: {},
        legend: {
          data:['销量']
        },
        xAxis: {
          data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
        },
        yAxis: {},
        series: [{
          name: '销量',
          type: 'bar',
          data: [5, 20, 36, 10, 10, 20]
        }]
      };
      // 使用刚指定的配置项和数据显示图表。
      myChartdom.setOption(option);
      window.onresize = function () {
        //自适应大小, 不用的话不会自适应大小。
        myChartdom.resize();
      };
    
    
    }
    
    onMounted(()=>{
      init()
    })
    
    </script>
    
    <style scoped>
    
    </style>

     

    调用:

    <echarts></echarts>
    
    <script setup>
    import echarts from './echarts.vue'
    </script>

     

     

     

     

     

     

  • unraid安装黑群晖

    1,去下载引导文件:https://sdeno.com/?p=9477

    我们要用到的是arpl.img引导文件跟用物理机安装的一样

     

    “虚拟机”—“添加虚拟机”—选中“Linux”,剩下按照下图操作

     

    2,剩下的如图:

    3,创建完成之后,参考https://sdeno.com/?p=9477,剩下的基本都一样。本教程需要网络必须要能科学上网否则无法成功

     

     

  • unraid直通

    直通就是不在给unraid管理,直接给虚拟机使用,少一层管理效果会更高。

     

    UNRAID直通硬盘

    1、我们先到unraid APPS市场中安装插件 unassigned devices

    这个插件可以看到新装入的硬盘,也可以挂载USB硬盘以及SMB其它NAS。

    2、插件安装完成后,我们安装一块需要直通的硬盘,这个硬盘不能用来加入 UNRAID 的阵列:

    unassigned devices 插件已经识别了这块硬盘了:

    3、用 UNRAID 自带的终端系统,输入代码:

    ls /dev/disk/by-id

    记住我们的代码

    4,在创建虚拟机的时候,继续添加硬盘的地方,选择 Manual :

    输入代码 /dev/disk/by-id/+ 刚刚找到的硬盘ID,就做好了直通了!

    /dev/disk/by-id/ata-WDC_WD100EZAZ-11TDBA0_JEJSMRTN

    如图: