尚硅谷vue2-vue3全套视频笔记-1

02模板语法

差值语法:功能单一就是将指定的值放在指定的位置

指令语法:

03 数据绑定

        vue中有两种数据绑定的方式:

        1.单向绑定(v-bind):数据只能从data流向DOM

                v-bind:key=name 可以简写为 :key=name

                key是DOM中el的属性,name为vue中的数据

        2.双向绑定(v-model):数据能从data流向DOM,也能从DOM流向data

                一般只应用在表单类元素中:input 、select

                v-model:value 可以简写为 v-model

04 el与data的两种写法
const vm = new Vue({

    el:'#root',//el第一种 new vue时指定el

    data:{//data第一种 对象式
        name:'xxx'
    }

    data(){//data第二种 函数式

        return{
            name:'xxx'
        }
    }
})

vm.$mount('#root')//el第二种 先创建vue实例,然后通过vm.$mount('#root')指定el
05 MVVM模型

MVVM为vm的双向绑定提供架构层面或者理论层面的支持。通过DOM listeners和data bindings实现模型驱动视图,视图驱动模型。

        M:model模型,vue实例中的数据

        V:view视图,vue实例对应的模板代码

        VM:viewmodel视图模型,vue实例

在vue中vm就是vue实例,作为view和model之间的桥梁,DOM中可以直接使用vue,pjo要交给vue维护,实现双向绑定,通过数据劫持(observer),解析器(compiler),watch实现:

        1.数据劫持:为数据提供响应式的getter和setter

        2.解析器:解析模板语法:v-model,绑定getter、setter和更新函数

        3.观察者:执行更新函数,通过diff算法判断是否生成新的真实DOM

06 数据代理
let number = 18
let person= {

    name:'xxx',
    sex:'xxx'
}

//三个参数,给哪个对象,设置哪个属性,属性的哪个配置项
Object.defineProperty(person,'age',{
    get(){
        return number
    },

    set(value){
        number = value
    }
    
})

07 事件处理
#事件的基本使用#

        1.使用v-on:xxx 或者@xxx 来绑定事件,其中xxx是事件名称

                @xxx=可以写一些简单的语句,获取vm中的值,这里可以体会一下双向绑定

//view 视图,DOM模型
<button @click='isTure = !isTure'>切换</button>

//vue vm视图模型
const vm = new vue({
    el:'#root',
    data:{
      isTure:ture
    }

})

        2.事件的回调需要配置在methods中,最终会在vm中

        3.methods中配置的函数,不要使用=>函数,不然this就是window

        4.methods中的函数,都会被vm接管,this指向vm或者组件实例对象

        5.@click="demo"和@click="demo($event)"效果一致,但是后者可以传参

#事件修饰符#

vue中有且只有六个事件修饰符:ppssoc,可以组合使用

        1.prevent:阻止默认事件(常用)

        2.passive:事件的默认行为会立即执行,无需等待事件的回调结果--移动端(手机,平板)

        3.stop:阻止事件冒泡(常用)

        4.self:只有事件的event-target是当前操作的元素时事件才会触发

        5.once:事件只触发一次(常用)

        6.capture:事件的捕获模式--捕获阶段处理事件

事件触发:

js中的事件流包括:事件捕获==>事件冒泡。默认情况下事件冒泡阶段处理事件。

父子组件都有一样的事件,事件捕获流程:父==>子。事件冒泡流程:子==>父。

#键盘事件#

除了keyup就是keydown,可以组合使用@keyup.ctrl.y,只有Ctrl+y才有效果

1.常用的键盘别名:

        回车、删除、退出、空格、换行==>enter delete esc space tab

        上下左右==>up down left right

2.未提供别名的按键,可以使用按键原始的key去绑定,要注意转换为kebab-case(短横线小写)

3.系统修饰键(用法特殊):shift /Ctrl/Alt/meta

        配合keyup:需要配合其他键,当其他键按键并释放后,事件触发

        配合keydown:正常使用

4.可以使用keycode指定具体的按键(不推荐)

5.通过keycode自定义按键别名:vue.config.keycodes.自定义别名=keycode

08 计算属性

        1.要使用的属性不存在,要使用已有的属性计算得来(只能是属性,只能是已有的)

        2.底层借助了Object.defineProperty的getter和setter方法

        3.getter方法什么时候被调用:

            初次使用时

            所依赖的属性发生变化时

        4.优势:有缓存,方便调试

        5.在vm中直接使用即可

09 监视属性

        1.当被监视的属性变化时,回调函数自动调用,进行相关操作

        2.监视的属性必须存在,才能进行监视!!

        3.监视的两种写法:

        (1)new Vue传入watch配置

        (2).通过vm.$watch监视

        深度检测

        1.vue中watch默认不监视对象内部值的变化

        2.配置deep:true可以监视对象内部值的变化

        备注:

        1.vue自身可以监视对象内部值的变化,但是watch不可以

        2.使用监视时,要根据对象的结构来决定是否采用deep

---小结

        1.computed能完成的watch都能完成,反之不行

        2.vue中的this

            vue管理的函数写成普通函数,非vue管理的函数写成箭头=>函数,目的就是让this指向                  vue,vue中有隐式的this。=>函数是window函数,没有隐式的this,会往外找,如果被vue             包裹,就会找到vue中隐式的this

10 绑定样式

按照样式定义的位置分为:

内联样式(定义在标签里面),内嵌样式,外部样式(定义在外部文件)

class样式
写法:class="xxx" xxx可以是字符串、对象、数组。
字符串写法适用于:类名不确定,要动态获取。
对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。

style样式
:style="{fontsize:xxx}"其中xxx是动态值。
:style="[a,b]"其中a、b是样式对象。

        操作DOM

        

        不操作DOM

        这个小Demo,可以理解一下MVVM模型,模型驱动DOM。

        

        11 条件渲染

        v-if:

               写法:v-if = '表达式'、v-elseif = '表达式'、v-else = '表达式',

               适用于:切换频率较低的场景

               特点:不展示的DOM元素直接被删除

                注意:一起使用时,结构不能被打断

        v-show:

                写法:v-show = '表达式'

                适用于:切换频率较高的场景

                特点:不展示的DOM元素不会被删除,仅仅使用样式进行隐藏

        使用v-if时DOM元素可能无法被获取,但是使用v-show一定可以获取

        12 列表渲染
        v-for:

                1.用于展示列表数据

                2.v-for="(item,index) in xxx"  :key="yyy"

                3.可以遍历数组,对象,字符串,指定次数

key的原理:

1.虚拟DOM中key的作用:作为diff算法的依据

2.diff算法:

        新虚拟DOM和旧虚拟DOM中有相同的key,然后比较key后面的内容:

        内容不一致:生成新的真实DOM,替换原来页面中的DOM

        内容一致:复用原来的真实DOM

        旧虚拟DOM中没有key:

        生成新的真实DOM,生成页面

        输入类元素在虚拟DOM中无法获取用户输入的内容,也就是说在虚拟DOM中只有元素,没有元素中的内容,在虚拟DOM中不比较内容,元素一样diff算法就是一致

vue.set

        Vue.set(Object,'属性名','属性值')/vm.$set()

        向响应式对象中添加一个属性,并保证该属性是响应式的,且触发视图更新,必须向响应式的对象中添加属性,因为vue无法探测普通的新增属性。例如:

        this.MyObject.Propertity='hi'

        注意:vue实例和vue的根数据不能作为被添加属性的对象

数组更新检测:

        vue将被监听的数组的变更方法进行了包裹,所以他们也将会触发视图更新,方法包括:

        push,pop,shift,splice,sort,unshift

13 收集表单数据

<input type='text'> v-model 收集的就是value,用户输入的就是value

<input type='radio'> v-model 收集的就是value,且要配置value

<input type='checkbox'> 

        没有配置value,v-model收集的就是checked

        配置了value,v-model默认值非数组收集的就是checked,是数组收集的就是value数组

v-model的三个修饰符:lazy,number,trim

14 过滤器

定义:对要显示的数据进行格式化之后再显示

语法:适用于插值语法或者单向绑定v-bind,{{xxx | filter名称}},v-bind:x="xxx | filter名称"

备注:多个过滤器可以串联,可以接收额外的参数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <script type="text/javascript" src="./vue.js"></script>
</head>
<body>
<div id="root">
    <h6>{{ msg | testFilter}}</h6>
</div>
</body>
<script type="text/javascript">

    Vue.filter('testFilter',function (value) {
        return value.slice(0,4)
    })

    new Vue({
        el:'#root',
        data:{
            msg:'hello,dear'
        }
    })
</script>
</html>
15 内置指令

v-text:和插值语法的作用一样,但是比插值语法灵活

v-html:可以解析html标签和指令,有安全性问题,可能导致xss攻击。

<div id="root">
    <div>{{ msg | testFilter}}</div>
    <div v-text="msg"></div>
    <div v-html="msg"></div>
</div>
</body>
<script type="text/javascript">

    Vue.filter('testFilter',function (value) {
        return value.slice(0,4)
    })

    new Vue({
        el:'#root',
        data:{
            msg:'<h3>hello,dear</h3>'
        }
    })
</script>

v-cloak:特殊的指令,没有值,vue实例初始化完成会删除该指令,可以配合CSS解决网速慢时显示的问题。

<script>标签不仅可以写在head里面,还可以写在body的最下方

<head>
    <meta charset="UTF-8">
    <title>test</title>
    <script type="text/javascript" src="./vue.js"></script>
</head>
<body>
<div id="root">
    <div>{{ msg | testFilter}}</div>
    <div v-text="msg"></div>
    <div v-html="msg"></div>
</div>
<script type="text/javascript" src="./vue.js"></script>  
<!--不仅可以写在head里面,还可以写在body的最下方-->
</body>

v-once:动态绑定一次之后就不在变化

<div id="root">
    <div v-once>{{ msg }}</div>
    <div>{{ msg }}</div>
    <button @click="msg++">puls</button>
</div>
</body>
<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            msg: 1
        }
    })
</script>

v-pre:可以让当前el不让vue来管理,跳过编译某些内容

16 自定义指令

directive:第一个参数是真实DOM元素(element),第二个参数是绑定信息,可以获取所有信息。

备注:

命名是多个单次使用kebab-case,定义时加引号'kebab-case',使用时加v-;

自定义指令中的this是window不是vm;

<div id="root">
    <div v-onc="msg"></div>
</div>
</body>
<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            msg: 2
        },
        directives: {
            //初始化和双向绑定时调用
            onc(element, binding) {
                element.innerText = binding.value * 10
            },
            oncc: {
                //初始化绑定时调用
                bind(element, binding) {
                    element.value = binding.value * 10
                },
                //元素被放置在模板时调用
                inserted(element, binding) {
                    element.focus()
                    // alert(2)
                },
                //双向绑定时调用
                update(element, binding) {
                    element.value = binding.value * 10
                }
            }
        }
    })
</script>
17 生命周期

又名:生命周期回调函数、生命周期函数、生命周期钩子;

vue在关键节点帮我们调用的一些有特殊名称的函数;

函数名称不能被修改,函数中的this指向的是vue或者组件实例;

v-bind:style="{opacity:opacity}"绑定样式的固定写法==>:style="{opacity}"

beforeCreate:数据代理,数据劫持创建之前;

created:

beforemount:

mounted:

beforeupdate:

updated:

beforedestroy:

destroyed:

常用的生命周期函数:

mounted:发送ajax,启动定时器,绑定自定义事件,订阅消息

beforedestroy:消除定时器,解绑自定义事件,取消订阅消息

问题总结:
赋值以后不显示:

The provided Vue.js code snippet and the function `openDialogForUpdate` indicate that you are setting the `state.ruleForm` object with properties like `id`, `name`, `code`, `language`, and `description` based on the `dict` parameter passed to the `openDialogForUpdate` function.

If the `language` field is not displaying its value in the form even though you are setting it in the `state.ruleForm`, there could be several reasons for this issue:

1. **Reactivity**: Vue.js is reactive, but if you are directly assigning a new object to a reactive property (`state.ruleForm` in this case), Vue might not detect the change. You might need to use Vue's `Vue.set` method or spread syntax to ensure reactivity.

2. **Initial Value**: If the initial value of `dict.language` is `undefined` or `null`, the disabled input might not show anything even if it's bound to `state.ruleForm.language`.

3. **Component Lifecycle**: Ensure that the `openDialogForUpdate` function is being called and that `state.ruleForm` is being updated before the form is rendered or updated in the DOM.

Here's a modified version of your `openDialogForUpdate` function to address potential reactivity issues:

const openDialogForUpdate = (dict: EmptyObjectType) => {
  state.ruleForm = {
    ...state.ruleForm, // Spread the existing state to ensure reactivity
    id: dict.id,
    name: dict.name,
    code: dict.code,
    language: dict.language,
    description: dict.description,
  }
}

Alternatively, you can use `Vue.set` to ensure reactivity for the `language` property:

const openDialogForUpdate = (dict: EmptyObjectType) => {
  Vue.set(state.ruleForm, 'id', dict.id);
  Vue.set(state.ruleForm, 'name', dict.name);
  Vue.set(state.ruleForm, 'code', dict.code);
  Vue.set(state.ruleForm, 'language', dict.language);
  Vue.set(state.ruleForm, 'description', dict.description);
}

After making these changes, when you call `openDialogForUpdate(dict)` before rendering the form, the `language` field should display its value correctly in the disabled input field.

vue是如何实现双向绑定的:

MVVM模型为双向绑定的实现提供理论或者架构层面的支持,不光是vue或者其他框架或者自定义实现双向绑定都可以遵循这一规范,

vue中vue的实例对应viewmodel,实例中的数据对应model,实例中的模板对应view,

具体实现流程vue中提供数据劫持为实例中的数据提供getter、setter等函数,提供解析器解析模板中的v-model指令并绑定对应数据的函数,提供观察者检测函数的改变,最后通过diff算法判断是否需要生成新的真实DOM。

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
尚硅谷vue-cli是一个基于Vue.js的脚手架工具,用于快速搭建Vue项目的开发环境。引用中提到了使用vue-cli创建项目的步骤,具体可以参考链接https://www.npmjs.com/package/vue-cli。而引用则是给出了使用vue-cli创建项目的例子。你可以根据这个例子,使用命令"vue init webpack 项目名"来创建一个名为vueDemo2的项目。需要注意的是,项目名不能包含大写字母。 在创建项目后,你可以看到项目结构如引用所示,其中包含了一些重要的文件和文件夹,比如src文件夹是源码文件夹,components文件夹用于存放Vue组件及其相关资源,App.vue是应用的根主组件,main.js是应用的入口文件,index.html是主页面文件,package.json是应用的包配置文件等等。 总结起来,尚硅谷vue-cli是一个方便快捷的工具,可用于创建Vue项目的开发环境,并提供了一套规范的项目结构和配置文件,方便开发者进行开发和维护。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [18_尚硅谷_Vue_使用vue-cli创建项目&&19_尚硅谷_Vue_基于脚手架编写项目](https://blog.csdn.net/qq_34983808/article/details/82595004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [尚硅谷课程 从头开始使用vue-cli创建项目](https://blog.csdn.net/Cecilia58/article/details/115741401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值