我想快速搭建一个完整的vue项目, 这让我很快就打定了注意: 使用
yarn global add @vue/cli
尝试了下它的命令vue ui
, 感觉很厉害, 图形化交互操作, 选择想要添加到项目的库和相关配置,
但偶尔会出状况, 加上看到它被标明beta
, 如是放弃, 规规矩矩用vue create project
vue add @vue/eslint --config airbnb --lintOn save
vue add router
vue add vuex
一步一步搭起, 很顺利, 现在可能真正开始了!
为了起步我的vue学习之旅, 提前准备了VSCode编辑器的插件:
Vetur
Prettier
当然也准备了chrome插件: Vue.js devtools
一上来就加了个/count
的路由, 用vuex
管理数据,放在store
里面, 一开始就了解vuex
,
是因为我想今后可以做大型项目, 和我之前React
一样
对比下刚写的,和我以前React项目中的代码片段, 思路差不多
Vue: (vuex)
import { mapState, mapActions } from "vuex";
export default {
name: "count",
computed: mapState({
count: state => state.count
}),
methods: mapActions(["increment", "decrement"])
};
React: (redux)
const mapStateToProps = createStructuredSelector({
messages: makeSelectMessages(),
});
const mapDispatchToProps = dispatch => ({
clear: () => {
dispatch({ type: CLEAR_MESSAGES });
},
});
export default connect(
mapStateToProps,
mapDispatchToProps,
)(Message);
vue和angular都是定位为框架, 不得不说配置环境起来真的方便很多,
而React我需要去捣鼓webpack的配置, 当然vue的环境变量配置本质
就是webpack.DefinePlugin
, 只是它和webpack整合了, 作为开发者就方便很多
文档中有段话, 提醒注意, 我理解意思是 如果有个.env.[mode]
文件, mode和NODE_ENV是有区别的, mode文件里没特别指明NODE_ENV时, NODE_ENV就等于mode名
Note that a mode is different from NODE_ENV, as a mode can contain multiple environment variables. That said, each mode does set NODE_ENV to the same value by default - for example, NODE_ENV will be set to “development” in development mode.
只有VUE_APP_
开头的变量才可以通过webpack的内置插件嵌入客户端包中.
(另外有两个特别的变量经常用到: NODE_ENV
, BASE_URL
)
Only variables that start with VUE_APP_ will be statically embedded into the client bundle with webpack.DefinePlugin.
vue.config.js
中同样可以设置变量, 也得带VUE_APP_
前缀, 但vue.config.js
配置就缺少个环境了, 一般是所有环境下都是固定值, 比如:
process.env.VUE_APP_VERSION = require('./package.json').version
module.exports = {
// config
}
:
表示 v-bind
, @
表示 v-on
缩写要么都用,要么不用, 不要混合使用
vue为了更高效的渲染元素, 通常会复用已有元素而不是从头开始渲染, 如果你想保证元素的独立, 请用 key
管理它
这两个input
框, 每次切换将被重新渲染
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email-input">
</template>
以上例子,虽然保证了独立, 但每次切换会重新渲染, 如果即想保证独立又不被重新渲染,
可以使用 v-show
, 具体看文档,
(需要注意是v-show
, 不支持template
, 也不支持v-else
, 也不需要使用key
, 它本身就是独立的)
做了几个使用vuex的实例, 在modules
文件夹下管理所有不同的数据, 的确很好使用, 而且可以动态注册和卸载module
, 这实用于中到大型项目, 现在慢慢我的demo项目目录结构越来越工程化了
关于动态注册, 我暂时的方案是在组件created
阶段注册(如果在mounted
阶段就不同步导致报错), 因为vue-router
支持azy-loaded
, 在组件里注册, modules
是异步动态添加的,
可以避免初始化store
过大.
import dynamicStore from "@/store/modules/dynamicStore";
const STORE_KEY = 'dynamicStore'
export default {
name: "dynamicStore",
created: function() {
if( !(STORE_KEY in this.$store._modules.root._children) ) {
this.$store.registerModule(STORE_KEY, dynamicStore)
}
},
...
};
预配置vue-cli
, 打造更详细的脚手架, 在preset.json
中预先配置, 然后
vue create --preset ./my-preset my-project
现在已经在demo中加入了eslint
, 下一步准备加入jest
, 用jest
是因为之前
react
使用的它