• vue:实例,挂载,模板语法,数据绑定,Object.defineProperty使用


    今天下午抽空看了会vue的视频,之前过了Js的基础与一些API的使用,急着给我的微服务项目部署前端页面,所以赶一下vue的基础,争取月末能通过vue的脚手架搭出好看的页面。

    之前在学校也自学过vue简单的东西,组件化思想和我们的java后端的模块化有异曲同工之妙,减少耦合提高内聚,代码复用。

    目前我们过基础就在html文件中编写vue的代码,后续赶高级写脚手架的时候就可以写vue文件了。

    首先需要引入vue.js文件(我是下载了vue.js文件(开发环境而非生产环境vue.min,js)):

    1. <script src="../JS库/vue.js">script>

    其次实例化一个vue对象的格式是:

    1. new Vue({
    2. el: '',
    3. data: {
    4. }
    5. })

    注意几个点:第一个键值对   key=el,value=挂载容器的css选择器名称,第二个键值对key=data,value=对象类型的数据(可以声明js对象定义中的属性与方法)

    一个vue实例都可以映射一个dom容器(容器作为view层,vue实例作为viewmodel层,data作为model层),dom容器可以是块级元素div:

    1. "app" v-if="isshow">
    2. {{massage}}
  • 容器(一块view的区域盒子)与vue实例映射的方式可以是id,class:

    1. el:'#app'
    2. el:'.app'
    3. el:document.getElementById('app')
    4. ...
    5. 也可以不写el键值对,将vue实例存在变量里,再修改变量的$mount('value')挂载的容器id

    我们来看以下代码:

    1. <div id="app" v-if="isshow">
    2. {{massage}}
    3. div>
    4. <div id="cdd">
    5. <span v-text="message">
    6. span>
    7. div>
    8. <div id="cpp">
    9. {{clazz}} {{name}}
    10. div>
    11. <script>
    12. // 阻止vue启动时产生生产提示信息
    13. Vue.config.productionTip = false
    14. // 创建Vue对象的方法 :
    15. // el根据css选择器指定挂载容器(可以为class类选择器也可以为id选择器) data存储对象数据供el指定的容器使用(注意作用范围)
    16. new Vue({
    17. // 比较傻乎乎的写法,根据Id获取dom对象来建立映射关系
    18. // el: document.getElementById('app'),
    19. el: '#app',
    20. data: {
    21. // 对象式声明data
    22. massage: '我是第一个vue实例',
    23. isshow: true
    24. }
    25. })
    26. new Vue({
    27. el: '#cdd',
    28. data: {
    29. message: '我是第二个vue实例'
    30. },
    31. //生命周期函数,根据单词意思就是在vue实例创建后执行的函数
    32. // created: function () {
    33. // alert('我是创建实例之后的钩子函数')
    34. // }
    35. })
    36. new Vue({
    37. el: '#cpp',
    38. data() {
    39. // 函数式声明data
    40. return {
    41. clazz: '193',
    42. name: '黄林春'
    43. }
    44. }
    45. })
    46. script>

    其中涉及到一些常用的vue命令,例如v-if与v-text命令,它们在vue的模板语法中都叫做命令语法,即解析标签的属性,绑定事件,标签内容等特性的命令规范。现在不列举命令语法中的命令,只作为比较插值语法来聊,至于插值语法,我们可以看到{{data中的属性名}}就能在标签体中获取到这部分的属性中进行渲染,当然不要在挂载该vue实例的容器中取别的vue实例的数据。

    这里我们也能发现里面有两种data的声明方式—函数式声明与对象式声明:

    1. new Vue({
    2. el:'#app',
    3. data(){
    4. //函数式声明data
    5. return{
    6. name:'黄林春'
    7. }
    8. }
    9. })
    10. new Vue({
    11. el: '#app',
    12. data: {
    13. // 对象式声明data
    14. isshow: true
    15. }
    16. })

    看起来,函数式声明对我们java程序员比较耐看且友好。

    其次我们来看看基础中的数据绑定:

    1. <div id="app">
    2. 单向数据绑定<input type="text" v-bind:value="name"/><br/>
    3. 双向数据绑定<input type="text" v-model:value="name">
    4. <hr/>
    5. <h2 v-bind:x="name">你好!h2>
    6. div>
    7. <script>
    8. new Vue({
    9. el:'#app',
    10. data(){
    11. return{
    12. name:'黄林春'
    13. }
    14. }
    15. })
    16. script>
    17. body>

    这里提到了两种绑定的命令:v-bind:value=“dat中的key” 以及 v-model:value="data中的key",二者的区别也说的清除,前者属于从data中拿数据渲染到标签内容也就是页面,后者则是在前者功能的基础上还可以实现从页面上修改vue实例中的data键值。这也就是单向数据绑定与双向数据绑定。

    前面我们提到el挂载的几种写法中有一种先将vue实例出来存储到变量里再修改其属性的方法($mount挂载):

    1. // 这种挂载的方式则大相径庭,先将vue实例创建出来再通过V变量的属性$mount去管理容器
    2. const v = new Vue({
    3. data(){
    4. return{
    5. name:'huanglinchun'
    6. }
    7. }
    8. })
    9. // v.$mount('#app')
    10. // 这样的挂载方式会灵活的改变页面数据的时间
    11. // 写个定时函数去改变页面的值,加载页面之后过了1s才会显示name的值
    12. setTimeout(() => {
    13. v.$mount('#app')
    14. },1000)

    前面也提到过容器作为view层,data作为model层(其实含有的不止是data还有vue实例的属性与方法以及函数都可以进行访问),vue实例则作为viewmodel层实现MVVM模型的构建,我们不难看到这个模型,特别是在我们的后端开发中,其中我们的dao层就是作为传递数据的model层(不是数据来源的层),我们的前端页面就是典型的view层,我们的controller层就是控制层也相当于MVVM模型中的viewmodel层,这个我们的spring中是有一个对象modelandview对象,可以控制视图也可以传递数据,不就相当于这里的vue实例吗?

    那么接下来就是我今天总结的最后一个(Object.definePropet()方法的使用):

    1. <script>
    2. // 简单的JS数据代理方法使用
    3. // 定义对象
    4. let person = {
    5. naem: '张三',
    6. sex: '男'
    7. }
    8. // // 传递三个参数:你需要操作的对象,对象需要添加的属性,该属性的配置项:例如value
    9. // Object.defineProperty(person, 'age', {
    10. // value: 18,
    11. // // 这里的enumerable默认为false即不可枚举的
    12. // enumerable: true,
    13. // // 这里writeable是默认为false即不可修改的
    14. // writeable:true,
    15. // // 这里的configurable默认是false即不可删除的
    16. // configurable:true
    17. // })
    18. // // 经过这样的方法之后person = {naem,sex,age} 但是这样得来的age是
    19. // 默认不能参与遍历的, 默认不能更改,默认不能删除
    20. // // 需要在配置项里设置 enumerable: true 实现可遍历,writeable:true 实现可修改, configurable:true 实现可删除
    21. // console.log(person)
    22. // // Object.keys(对象名)可以将对象的属性名提取出来放到一个Array数组中
    23. // console.log(Object.keys(person))
    24. let number = 20
    25. // 如果这里需要让number等于person的年龄属性并实现可以随着number的改变而改变age
    26. Object.defineProperty(person, 'age', {
    27. // 当读取age属性的时候将调用getter函数,返回值返回给age
    28. get: function () {
    29. console.log('正在读取geter方法')
    30. return number
    31. },
    32. // 当改变age属性的时候将调用setter函数,且会获取到具体修改的值,
    33. // 这里需要在函数内部异步修改number变量的值
    34. set(value) {
    35. console.log('修改age的值为' + value)
    36. number = value
    37. }
    38. })
    39. script>

    Object.definePropet()方法的作用是什么呢?即在指定的对象内部添加新的属性,我们可以对属性的配置进行设置,例如初始值,可修改,可删除,可枚举等等。

    这里的代码就是对person对象新增age属性的一些操作:

    1. // 传递三个参数:你需要操作的对象,对象需要添加的属性,该属性的配置项:例如value
    2. Object.defineProperty(person, 'age', {
    3. value: 18,
    4. // 这里的enumerable默认为false即不可枚举的
    5. enumerable: true,
    6. // 这里writeable是默认为false即不可修改的
    7. writeable:true,
    8. // 这里的configurable默认是false即不可删除的
    9. configurable:true
    10. })

    那么这些都是最简单的,因为我们如果想修改它的值给的配置比较多,这里我们可以通过setter与getter的方式对配置项进行修改:

    1. let number = 20
    2. // 如果这里需要让number等于person的年龄属性并实现可以随着number的改变而改变age
    3. Object.defineProperty(person, 'age', {
    4. // 当读取age属性的时候将调用getter函数,返回值返回给age
    5. get: function () {
    6. console.log('正在读取geter方法')
    7. return number
    8. },
    9. // 当改变age属性的时候将调用setter函数,且会获取到具体修改的值,
    10. // 这里需要在函数内部异步修改number变量的值
    11. set(value) {
    12. console.log('修改age的值为' + value)
    13. number = value
    14. }
    15. })

    这里我们不难看出我们是在用Object对象的方法去修改person的属性,这种方式我们在java设计思想中叫做代理思想(AOP开发用cglib做代理,bean的实例化可以用动态或者静态工厂做代理,这都是代理思想的体现,实际上就是相当于结婚典礼交给婚庆公司一样,要的结果就是结婚,无非找第三方来做结婚这件事)。

     

  • 相关阅读:
    2.1.6.15 漏洞利用-smb-RCE远程命令执行
    Uniapp零基础开发学习笔记(11)-安装扩展组件uni-ui/uView及微信小程序开发环境
    java 匿名内部类
    ActiveMQ window安装、修改密码、启动一闪而过、设置8161端口仅本地访问
    第二章 C++对C的拓展
    【大数据】9大实战项目解决你所有烦恼(写论文、找工作)
    Win11蓝屏代码IRQL NOT LESS OR EQUAL的处理方法
    支付行业稳步发展,畅联助企惠民、合规前行
    女生神经末梢最多的部位,女性身上哪里神经最多
    Python中利用SQLAlchemy模块操作MySQL数据库
  • 原文地址:https://blog.csdn.net/m0_59588838/article/details/127433778