从0开始做系统之vue

时间:2022-06-26
本文章向大家介绍从0开始做系统之vue,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我们做工程,或者做产品的时候,很多时候不需要从最基本的元素做器,直接用模块集成就可以了,这就是分工的不同。做电子产品的时候,不需要去造二极管,直接用集成电路。做食物的时候,不需要去种食材,直接用原材料加工一下就可以了。做软件也是如此。

不知道有人见过造房子或者建设工程没有。最基本的是水泥,沙子,然后跟钢精一起凝结成混凝土。如果要按照传统的方法,在施工现场,要将沙子,水泥和水按照一定的比例搅拌,然后根据一定的模具,做成构件。等构件凝固好后,才能进行下一步。

近些年中国的高铁,以及造桥技术越来越快,越来越先进。 基建狂魔的建设已经将世界甩在了后面。就是打破的传统,构件提前在工厂做好,工程中直接安装构件。这样效率就会提高很多。

这,这跟软件有什么关系? 软件工程中也可以有构件的思想。直接封装好这种构件,拿来用。 今天要给大家介绍一下vue, 它也是前端利用了构件的思想。

  1. Vue.js是什么? 1). 一位华裔前Google工程师(尤雨溪)开发的前端js库 2). 作用: 动态构建用户界面 3). 特点: * 遵循MVVM模式 * 编码简洁, 体积小, 运行效率高, 移动/PC端开发 * 它本身只关注UI, 可以轻松引入vue插件和其它第三库开发项目 4). 与其它框架的关联: * 借鉴angular的模板和数据绑定技术 * 借鉴react的组件化和虚拟DOM技术 5). vue包含一系列的扩展插件(库): * vue-cli: vue脚手架 * vue-resource(axios): ajax请求 * vue-router: 路由 * vuex: 状态管理 * vue-lazyload: 图片懒加载 * vue-scroller: 页面滑动相关 * mint-ui: 基于vue的组件库(移动端) * element-ui: 基于vue的组件库(PC端)

2. 基本使用

1). 引入vue.js
2). 创建Vue实例对象(vm), 指定选项(配置)对象
    el : 指定dom标签容器的选择器
    data : 指定初始化状态数据的对象/函数(返回一个对象)
3). 在页面模板中使用{{}}或vue指令

3. Vue对象的选项

1). el

指定dom标签容器的选择器
Vue就会管理对应的标签及其子标签

2). data

对象或函数类型
指定初始化状态属性数据的对象
vm也会自动拥有data中所有属性
页面中可以直接访问使用
数据代理: 由vm对象来代理对data中所有属性的操作(读/写)

3). methods

包含多个方法的对象
供页面中的事件指令来绑定回调
回调函数默认有event参数, 但也可以指定自己的参数
所有的方法由vue对象来调用, 访问data中的属性直接使用this.xxx

4). computed

包含多个方法的对象
对状态属性进行计算返回一个新的数据, 供页面获取显示
一般情况下是相当于是一个只读的属性
利用set/get方法来实现属性数据的计算读取, 同时监视属性数据的变化
如何给对象定义get/set属性
    在创建对象时指定: get name () {return xxx} / set name (value) {}
      对象创建之后指定: Object.defineProperty(obj, age, {get(){}, set(value){}})

5). watch

包含多个属性监视的对象
分为一般监视和深度监视
    'xxx' : {
        deep : true,
        handler : fun(value)
    }
另一种添加监视方式: vm.$watch('xxx', funn)

vue内置指令

v-text/v-html: 指定标签体
    * v-text : 当作纯文本
    * v-html : 将value作为html标签来解析
v-if v-else v-show: 显示/隐藏元素
    * v-if : 如果vlaue为true, 当前标签会输出在页面中
    * v-else : 与v-if一起使用, 如果value为false, 将当前标签输出到页面中
    * v-show: 就会在标签中添加display样式, 如果vlaue为true, display=block, 否则是none
v-for : 遍历
    * 遍历数组 : v-for="(person, index) in persons"   
    * 遍历对象 : v-for="value in person"   $key
v-on : 绑定事件监听
    * v-on:事件名, 可以缩写为: @事件名
    * 监视具体的按键: @keyup.keyCode   @keyup.enter
    * 停止事件的冒泡和阻止事件默认行为: @click.stop   @click.prevent
    * 隐含对象: $event
v-bind : 强制绑定解析表达式
    * html标签属性是不支持表达式的, 就可以使用v-bind
    * 可以缩写为:  :id='name'
    * :class
      * :class="a"
        * :class="{classA : isA, classB : isB}"
        * :class="[classA, classB]"
    * :style
        :style="{color : color}"
v-model
    * 双向数据绑定
    * 自动收集用户输入数据
ref : 标识某个标签
    * ref='xxx'
    * 读取得到标签对象: this.$refs.xxx

不好理解,我开始学的时候也觉得简单,看过以后就忘记了。 我们可以这样来理解,我们把前端比喻成造工程。 不管是造桥,还是造大厦,还是造图书馆,他都有一个外在的样子,和内在材料使用情况:

<div id="app">
  {{ message }}
</div>

var app = new Vue({
  el: '#app',       //element需要获取的元素
  data: {
    message: 'Hello Vue!'
  }
})

其中html是外在样子,JS是实际的材料使用。 为了预防偷工减料,豆腐渣工程,我们用三个方法来检测材料的使用情况,下面开始纪委,或者监理开始审计。

元素el可以理解为需要审计的项目,比如地下室。 data可以理解为施工单位的上报数据。 可以有三种方式: watch(监理每天监视) computed(计算审计) methods(通过各种技术手段) 上面可以理解为对数据的审计。

下面可以理解为对流程的审计。 v-bind 可以理解为,对谁进行责任制

<div id="app-2">
  <span v-bind:title="message">    //属性绑定可以应用于好多其他标签的属性
    鼠标悬停几秒钟查看此处动态绑定的提示信息!
  </span>
</div>
var app2 = new Vue({
  el: '#app-2',
  data: {
    message: '页面加载于 ' + new Date().toLocaleString()
  }
})

我们可以用 v-on 指令添加一个事件监听器,比如对招投标进行流程化监督

<div id="app-5">
  <p>{{ message }}</p>
  <button v-on:click="reverseMessage">逆转消息</button>
</div>
var app5 = new Vue({
  el: '#app-5',
  data: {
    message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})

v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。可以理解为相互监督:

<div id="app-6">
  <p>{{ message }}</p>
  <input v-model="message">
</div>
var app6 = new Vue({
  el: '#app-6',
  data: {
    message: 'Hello Vue!'
  }
})

对流程的审计,也可以是三部分,对人,对事件,和双方监督。 好了,附上刚开始学习时写的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Get Password</title>
    <script src="https://cdn.bootcss.com/vue/2.6.9/vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>

<div id="app1">
{% raw %}
    <input v-model="message">
    <button type="button"  @click="get_password">submit</button>

    <p>account is: {{ message }}</p>

    <p>password is: {{ password }}</p>

</div>
{% endraw %}
<script>
    var v1 = new Vue({
        el: '#app1',
        data: {
            message: 'stest',
            password: '',
        },
        watch : {
            my(v) {
                this.password = this.get_password();

    }

        },

        methods: {
            get_password() {
                axios.get('/accounts', {
                    headers: {
                        'Access-Control-Allow-Origin': '*',
                    },
                    crossDomain: true,
                    contentType: "application/json",
                    params: {
                        account: this.message,//接口配置参数(相当于url?id=xxxx)
                    },
                }).then((res) => {
                    console.log(res.data['password']);//处理成功的函数 相当于success
                    this.password = res.data['password']
                })
                .catch(error => console.log(error))
            }
        }

    })


</script>

</body>
</html>

后端是用flask实现的。

from flask import Flask,render_template,request,jsonify

app = Flask(__name__)


# @app.route('/')
# def hello_world():
#     return render_template("index.html")

@app.route('/')
def index():
    return render_template("home.html")


@app.route('/accounts', methods=['GET'])
def get_accounts():

    if request.method == "GET":

        username = request.args.get("account")
        password = "aaa" #query_account(username)
        if password == "":
            return "no result"
        else:
            #return render_template("home.html",message=username,password=password)
            return jsonify({"password": password})


if __name__ == '__main__':
    app.run()

这就是构件的魔力!

更多精彩,请关注微信公众号:python爱好部落