Vue 学习“初体验”

Vue 学习“初体验”

1. vue是什么东西

vue是一个js框架

​ js框架又是什么,就是一个用来把网页相关的乱成一团的css,html,js分分类整理在一起

​ vue官网的视频上说的好像就是这个意思


在我看来,单单一个vue就是一个js的对象,可以绑定页面元素,根据自己的生命周期以及属性动态绑定或者双向绑定标签属性,十分强大

		真正能够分类整理文件的,是***vue-cli脚手架***,快速模块开发

2. vue生命周期

学生命周期是为了什么,我认为,生命周期钩子函数能够在页面的某个阶段对页面数据进行修改

在这里插入图片描述

比较重要的:created() 是在数据渲染之前,mounted() 是在数据渲染之后, updated() 是在数据更新之前

3.vue语法

3.1 属性

属性名作用
el指定被绑定的页面元素,#代表id,.代表class,等
data渲染页面的数据源,就页面上的数据都从data里面来
methods事件触发的方法都在这里
computed可以计算data里的数据
watch这里的方法都“盯着某一个data里的值",来修改其他data的值

每一个属性的值都是一个对象

el属性对应一个字符串对象

其他属性都是类似: data:{}

js里,方法也是一个对象

3.2 指令

v-model

​ 这个就是双向绑定数据的,“一脉相承”,页面元素改变模型元素也改变,MVVM

​ 用法

<div v-model="data1"> </div> 或者 <div>{{ data1 }}></div>
v-bind

​ 和上边的不同,需要绑定在标签的某个属性上,而且只会根据模型改变标签内容,反之不成立,只有MV

​ 用法

<img v-bind:src="">

​ 或者

<img :src="">
v-on

​ 触发事件,比如

<button @click=""></button>

​ 或者

<button v-onclick=""></button>
v-for

​ v-for有两种,我知道的,一个是遍历对象所有属性,一个是遍历数组中所有对象

​ 但是无论哪种,都是json数据

​ 遍历对象时

<ul>
    <li v-for="(item, key, index) in obj" :key="index">{{ item.item }}</li>
    <!-- item才是属性值,key才是属性名,不要搞混,index是第几个属性,:key好像是个vue固定写法 -->
</ul>

​ 遍历数组

<ul>
    <li v-for="(item, index) in obj" :key="index">{{ item.item }}</li>
    <!-- item是数组内的某个对象,index是第几个对象 -->
</ul>
3.3 表单示例

​ 学习了上面的语法,那么就应该要处理网页中传递数据的重要组成部分,表单,下面给出几个示例,进行参透

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			国籍:
			<select v-model="countryid">
				<option v-for="item in countries" :value="item.key">
					{{ item.value }}
				</option>
			</select>
			<div>{{ countryid }}</div>
		</div>
		
		<script>
			var vue = new Vue({
				el: '#app',
				data: {
					countries: [
						{key: 1, value: '中国'},
						{key: 2, value: '美国'},
						{key: 3, value: '英国'},
						{key: 4, value: '德国'}
					],
					countryid: ''
				}
			})
		</script>
	</body>
</html>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<form>
				喜好:
				<input type="checkbox" v-model="likes" value="1"/>
				<input type="checkbox" v-model="likes" value="2"/>
				<input type="checkbox" v-model="likes" value="3"/>
			</form>
			<div>{{ likes }}</div>
		</div>
		
		<script>
			var vue = new Vue({
				el: '#app',
				data: {
					likes: ['1', '3']
				}
			})
		</script>
	</body>
</html>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<form>
				sex:
				<input type="radio" v-model="sexes" value="boy"/>
				<input type="radio" v-model="sexes" value="girl"/>
			</form>
			<div> {{ sexes }} </div>
		</div>
		
		<script>
			var vue = new Vue({
				el: '#app',
				data: {
					sexes: 'boy'
				}
			})
		</script>
	</body>
</html>

4. vue-cli 脚手架的安装和项目建立

HBuilder、WebStorm好像可以直接搞,但是我使用的还是***Visual Studio Code***

具体步骤

  • 安装vscode
  • 安装nodejs
  • 安装淘宝镜像
  • 在本地新建一个空文件夹作为项目目录
  • 打开vscode,打开那个空文件夹
  • terminal -> new terminal打开控制台(可用cmd)
  • 安装vue-cli,cnpm install vue-cli -g
  • 创建项目,vue init webpack 项目名,时间长,可选组件(我不愿意选eslint,写js退格4个都不行)
  • cd 项目,不要漏掉这一步啊!!!!!!!
  • 运行项目,cnpm run dev

解释一下nodejs和淘宝镜像:

首先就是,安装这些东西需要一个cmd命令***npm***,要下载安装***nodejs***,具体是什么,暂时未知

npm有可能会很慢,那么就需要安装***cnpm***,淘宝镜像,百度一搜就有

可能遇到脚本不能运行cnpm的问题

  • 管理员运行vscode
  • terminal下 get-ExecutionPolicy查看,应该是Restricted
  • set-ExecutionPolicy RemoteSigned,授权
  • 再次查看,是RemoteSigned,就可以用了

关于工程目录

我觉得只需要知道,需要安装的所有东西,都应该在package.json中有记录

我们要做的事情,基本上就在src目录

在这里插入图片描述
assets 只放了一张vue的logo图片,过~

components译为组件,里面放的是一些vue文件,这些vue文件我就把它当作页面来看,这里的vue文件不在router下添加路径

router译为路由,里面只有一个js文件,这个文件是管路由,即你在网址上输入index.js文件里的path,就能找到相应的界面,还能够在页面跳转上起作用

再下面的App.vue是主页面,main.js是真·主界面,为什么这么说呢?

// main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

其实整个工程就这么一个Vue对象,他有三个上面没有说过的属性:

  • router 其实就是上面说过的router文件夹里的js对象
  • components 就是上面说过的App.vue作为组件(其实vue都是组件)
  • template 这才是显示界面,就显示App组件

5. vue文件

那么,这个vue组件,应该长什么样子

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

三部分构成:

  • template 显示,就是html的写法
  • script 用export default表示一个对象,和vue对象一样
  • style css样式,变好看

父子组件通信

父组件需要加在路由里,个人喜欢新建一个src下的目录views

子组件不需要加在路由里,想加也可以,放在components里

懒了,直接贴代码了

父组件

<template>
  <div>
    <h1>father</h1>
    <child :message='msg' />
    <child @get-msg="getmsg" />
    <p>child sent '{{ msgback }}' to father</p>
    <child>slot content</child>  
  </div>
</template>

<script>
import child from '@/components/child'
export default {
  name: 'father',
  components: {
    child
  },
  data() {
    return {
      msg: 'hello world',
      msgback: '',
    }
  },
  methods: {
    getmsg(data) {
      this.msgback = data.msg
    }
  }
}
</script>

子组件

<template>
  <div>
    <h1>child</h1>
    <p>Father sent '{{ message }}' to child </p>
    <p>
      slot from father<br />
      <slot />
    </p>
  </div>
</template>

<script>
export default {
  name: 'child',
  props: ['message'],
  created() {
    this.$emit('get-msg', {msg: 'hey ya'})
  }
}
</script>

效果

在这里插入图片描述

6. vuex

vuex就是创建类似全局变量的东西,所有vue都能够访问得到

1. 安装使用

  • 工程目录下使用 cnpm intsall -i --save vuex 记得package.json吗,要dependencies里面有vuex才行

  • 改造目录,在src目录下加上一个新目录store,store下新建一个文件夹modules和一个index.js文件

    在这里插入图片描述

  • index其实就是vuex对象,对象里只有一个属性,modules,modules属性 里就是 modules文件夹 下的js文件导出的vuex对象

2.vuex对象的五个属性

  • state 想存的数据都放在state

  • getter 计算state,获取结果

  • mutations 用commit提交数据的变更,修改函数

  • actions 一般是异步,必须调用mutations

    ​ 不可以直接修改state

    ​ 一般需要发送网络请求

  • modules 模块化数据

index.js里只有modules属性,而其他四个属性一般都在modules目录下的对象里

/* 购物车模块,包括商品列表以及总价 */

const state = {
  items: [],
  total: 0
}

const mutations = {
  // 修改总价
  // 参数是上面的state,商品个数amount以及价格price
  // 加入购物车amount应赋值为1
  calTotal(state, info) {
    state.total += info.amount * info.price
  },

  // 加入列表
  addItem(state, item) {
    // 加入到列表同时为商品增加一个数量属性
    item.count = 1
    state.items.push(item)
  }
}

const actions = {
  // 调用mutations计算总价
  calprice({commit}, info) {
    commit("calTotal", info)
  },

  // 调用mutations增加商品
  add({commit}, item) {
    commit("addItem", item)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

3.辅助函数mapState

mapState可以直接获得store目录下modules的属性

computed: mapState({
        // 这里的参数state包括了modules的成分,debug出来的,原因未知,难不成是这里的state是store对象的state,自动包含了子模块中的state?
        list: state => state.mylist.goods
    }),

还有其他辅助函数,没用过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值