标签 vue 下的文章

安装

在vue ui中的插件处安装

使用

store 文件夹下面的 index.js

import { createStore } from 'vuex'

export default createStore({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

state 存放的是变量, getters 存放的是需要由 state 中的变量动态计算生成的变量, mutations 存放的是直接对 state 中变量进行修改的函数, actions 存放的是对 state 的各种更新方式(不能对state进行直接修改), modules 可以将 state 进行分割,避免代码过长。

在标签中使用变量
示例:

<ul class="navbar-nav" v-if="!$store.state.user.is_login">
    <li class="nav-item">
    <router-link class="nav-link" :to="{name: 'login', params: {}}">登录</router-link>
    </li>
    <li class="nav-item">
    <router-link class="nav-link" :to="{name: 'register', params: {}}">注册</router-link>
    </li>
</ul>
<ul class="navbar-nav" v-else>
    <li class="nav-item">{{ $store.state.user.username }}</li>
</ul>

使用 $store 访问store,user是一个module,所以通过这样的方式来访问user中的is_login变量

script 中使用
示例:

import { useStore } from 'vuex';
export default {
  name: 'UserListView',
  components: {
  },
  setup() {
    const store = useStore();
    console.log(store.state.user.username);
  }
}

在外部使用 actions 中的函数需要用到 useStore 这个组件
例如:

setup() {
    const store = useStore();
    const login = () => {
      store.dispatch("login", {
        username: username.value,
        password: password.value,
        succuss() {
          console.log("success");
        },
        error() {
          console.log("error");
        }
      })
    }
    return {
      login
    }
}

这里用 store 来接收 useStore() 返回的对象,使用 store.dispatch 来调用 login 函数, store.dispatch 传了两个参数,第一个是函数名,第二个是数据。

user.js:

import $ from 'jquery';
const ModuleUser = {
    state: {
        id: "",
        username: "",
        photo: "",
        followerCount: 0,
    },
    getters: {
    },
    mutations: {
    },
    actions: {
        login(context, data) {
            console.log(data);
            $.ajax({
                url: "xxx",
                type: "POST",
                data: {
                    username: data.username,
                    password: data.password,
                },
                success(resp) {
                    console.log(resp)
                }
            })
        }
    },
    modules: {

    }
};
export default ModuleUser;

actions中的login函数两个参数,第一个是上下文context,里面有很多自带的api,第二个是数据,可以通过外部使用这个函数时传入。

index.js:

import { createStore } from 'vuex'
import ModuleUser from './user'
export default createStore({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
    user: ModuleUser,
  }
})

这里user单独写一个module独立出去,只要在index.js中引入并在modules中添加这个变量即可。

mutations 中的函数需要传两个参数一个是 state 用来访问state中的变量,另外一个是自定义的参数。

mutations: {
    updateUser(state, user) {
        state.id = user.id;
        state.username = user.username;
        state.photot = user.photo;
        state.followerCount = user.followerCount;
        state.access = user.access;
        state.refresh = user.refresh;
        state.is_login = user.is_login;
    },
},

actions 中使用 mutations 中的函数示例:

context.commit("updateUser", {
    ...resp,
    access: access,
    refresh: refresh,
    is_login: true,
})

使用 context 中的commit函数,传两个参数,一个是函数名称,另外一个是自定义参数。

在form第一个便签里加上 @submit 属性,后面跟上执行的函数,
例如:

<form @submit="login">
    <div class="mb-3">
      <label for="username" class="form-label">Username</label>
      <input v-model="username" type="text" class="form-control" id="username">
    </div>
    <div class="mb-3">
      <label for="password" class="form-label">Password</label>
      <input v-model="password" type="password" class="form-control" id="password">
    </div>
    <div class="error-message">{{ errorMessage }}</div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

如果需要禁用掉默认事件可以用 @submit.prevent 例如:

<form @submit.prevent="login">
    <div class="mb-3">
      <label for="username" class="form-label">Username</label>
      <input v-model="username" type="text" class="form-control" id="username">
    </div>
    <div class="mb-3">
      <label for="password" class="form-label">Password</label>
      <input v-model="password" type="password" class="form-control" id="password">
    </div>
    <div class="error-message">{{ errorMessage }}</div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

安装

npm i jquery

引入

import $ from 'jquery';

使用

$.ajax({  
    url: url,  
    type: "xxx",  
    data: {  
    },  
    dataType: "json",  
    success: function (resp) {  
    },  
});

注: xxx 填方法类型,比如 get,post,delete

其中的 success: function (resp) 可以直接写成 success(resp) 比如:

$.ajax({
  url: 'url',
  type: 'get', 
  success(resp) {
    console.log(resp);
  }
})

需要验证 jwt 的get方法示例:

$.ajax({
    url: "xxx",
    type: "get",
    data: {
        user_id: access_obj.user_id,
    },
    headers: {
        'Authorization': "Bearer " + access,
    },
    success(resp) {
        console.log(resp);
    }
})
headers: {
    'Authorization': "Bearer " + access,
},

添加了一个headers属性,里面需要加一个 Authorization 属性,表示授权,access就是访问令牌jwt。其中 "Bearer" 看具体的api可能会有不同的定义。

事件函数的编写需要在 export default{} 中的 setup() 函数中例如:

setup(props) {
    let fullname = computed(() => props.user.firstName + ' ' + props.user.lastName);

    const follow = () => {
        console.log("follow");
    }

    const unFollow = () => {
        console.log("unfollow");
    }

    return {
        fullname,
        follow,
        unFollow,
    }
}

注意,写的函数要return出去才可以使用

使用样例:

<button v-on:click="follow" v-if="!user.is_followed" type="button" class="btn btn-secondary btn-sm">follow</button>
<button v-on:click="unFollow" v-if="user.is_followed" type="button" class="btn btn-secondary btn-sm">un-follow</button>

使用 v-on:click 绑定事件函数,其中 v-on: 可以简写为 @ 例如:

<button @click="follow" v-if="!user.is_followed" type="button" class="btn btn-secondary btn-sm">follow</button>
<button @click="unFollow" v-if="user.is_followed" type="button" class="btn btn-secondary btn-sm">un-follow</button>

触发父组件的函数:
使用 context.emit() ,例如:

setup(props, context) {
    let fullName = computed(() => props.user.lastName + ' ' + props.user.firstName);

    const follow = () => {
        context.emit('follow');
    };

    const unfollow = () => {
        context.emit("unfollow");
    }

    return {
        fullName,
        follow,
        unfollow,
    }
}

和上一个 setup 相比,这里需要传一个上下文 context 然后使用 context.emit 来绑定
注意:这里的props和context是由位置决定的,不是由名字决定的,所以假如在没有用到props时,想绑定事件,也依旧要传一个props。

父组件中template:

<UserProfileInfo @follow="handlefollow" @unFollow="handleunFollow" :user="user"/>

context.emit 绑定的事件名称就是 @ 后面的名称,所以只要一一对应就行,也可以不和函数名称相同。 = 后面的就是触发的函数。这些被触发的函数同样写在 setup 中,也同样需要被return出去,例如:

setup() {
    const user = reactive({
        id: 1,
        username: "heky",
        lastName: "he",
        firstName: "ky",
        followerCount: 999,
        is_followed: false,
    });

    const handlefollow = () => {
        console.log("u");
    };

    const handleunFollow = () => {
        console.log("u")
    }

    return {
        user,
        handlefollow,
        unFollow,
    }
}

假如有传递参数,就在 context.emit() 再多传一个参数
例如:

const post_a_post = () => {
    context.emit('post_a_post', content.value);
    content.value = "";
}

而对应的触发事件需要加一个传入的形参,
例如:

const post_a_post = (content) => {
    posts.count ++;
    posts.posts.unshift({
        id: post_a_post.count,
        user_id: 1,
        content: content,
    })
}

setup(props, context):初始化变量、函数

  • ref定义变量,可以用.value属性重新赋值
  • reactive定义对象,不可重新赋值,当他的值发生改变(一般是对象中的某一个属性改变)会将有使用这个对象的组件重新渲染一遍。
  • props存储父组件传递过来的数据
  • context.emit():触发父组件绑定的函数

vue 中通过 setup() 函数来初始化变量。setup函数写在 export default {} 中,可以用 setup = () => {} 即箭头函数的写法,也可以直接写作 setup()
例子:

export default {
name: 'UserProfileView',
components: {
    ContentBase,
    UserProfileInfo,
    UserProfilePosts
},
setup() {
    const user = reactive({
        id: 1,
        username: "heky",
        lastName: "he",
        firstName: "ky",
        followerCount: false,
    });

    return {
        user,
    }
}
}

这个例子中定义了一个user的变量对象,里面放着5各变量,之后将要用到的变量对象 user return出去

之后可以在子组件的标签中用 v-bind: 来绑定
例如:

<UserProfileInfo v-bind:user="user"/>

v-bind: 也可以省略为 : ,例如:

<UserProfileInfo :user="user"/>

等号后面的冒号可以传入一个表达式,这里将 user 传入

之后要在组件中使用,需要将用到的组件放到 export default{}propsprops 是一个对象。
例如:

export default {
    name: "UserProfileInfo",
    props: {
        user: {
            type: Object,
            required: true,
        },
    }
}

其中user也是作为一个对象来写,有两个值,一个是类型,另外一个是是否需要。
这样写完之后就可以在 template 中用了,使用时用两个大括号括起来 {{}}
例如:

<div class="username">{{ user.username }}</div>
<div class="fans">fans: {{ user.followerCount }}</div>

如果想作为属性的值进行使用,可以在对应的属性前面加上 :
例如:

<img :src="user.photo" alt="" class="img-fluid" >

这里的 user.photo 是一个变量而不是当作一个字符串,作用于src这个属性,所以src前面加上一个冒号( :v-bind: 的简写)

如果需要对变量进行计算然后实现动态变化,需要在组件中设置一个新的变量,以及用到vue中的 computed 函数
例如:

import { computed } from 'vue';

export default {
    name: "UserProfileInfo",
    props: {
        user: {
            type: Object,
            required: true,
        },
    },
    setup(props) {
        let fullname = computed(() => props.user.firstName + ' ' + props.user.lastName);
        return {
            fullname
        }
    }
}

这里setup函数传入一个变量props表示当前组件的props,然后在里面定义了一个新的变量 fullname 调用 computed 函数动态计算变量的值,注意 computed 函数接收一个函数,之后也是一样将要用到的变量return出去就可以了。
在template中使用:

<div class="username">{{ fullname }}</div>

使用 v-model 属性获取html标签内的内容示例:

<template>
    <textarea v-model="content" class="form-control" id="edit-post" rows="3"></textarea>
</template>

<script>
import { ref } from 'vue';
export default {
    name: "UserProfileWrite",
    setup() {
        let content = ref("");

        return {
            content,
        }
    }
}
</script>

变量对象可以用 reactive ,单个变量可以使用 ref 。示例中使用 v-model 将textarea中的内容绑定到content这个变量中,之后要取得这个值可以用 content.value 来取。之后如果要修改这个值也可以直接对 content.value 进行赋值。

注:其实用 reactive 也是可以赋值的,不过是对对象中的属性赋值,一般如果变量是对象就用 reactive 否则可能就用 ref