第十九节:带你梳理Vue2: 父组件向子组件传参(props传参)

1. 组件嵌套

1.1 组件的嵌套使用

之前有说过,Vue组件跟Vue实例是一样的,因此在Vue中一个组件中也可以定义并使用自己的局部组件,这就是组件的嵌套使用

例如:示例代码如下:

<div id="app"><!-- 3. 使用组件 --><my-component></my-component>
</div><script>// 子组件选项let sonComponent = {template:`<span>我是子组件</span>`,}//  父组件选项对象let MyComponent = {template: `<div><h2>我是父组件</h2><my-son></my-son><my-son /></div>`,// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}// 2. 注册局部组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})
</script>

显示结果:

组件的嵌套使用.png

通过示例我们就了解到,组件可以嵌套使用,那么我们就不得不思考一个问题,他们各自之间的数据关系如何?能否相互使用对方的数据呢?

1.2 组件间的数据关系

组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。

示例代码如下

<div id="app"><!-- 3. 使用组件 --><my-component></my-component>
</div><script>// 子组件选项let sonComponent = {template:`<span>我是子组件{{msg}}</span>`,}//  父组件选项对象let MyComponent = {template: `<div><h2>我是父组件</h2><h3>父组件中使用子组件</h3><my-son></my-son><my-son /><h3>父组件中使用父组件数据</h3>{{ msg }}</div>`,data(){return {msg: "哈哈,我是父组件数据"}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}// 2. 注册局部组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})</script>

显示结果:

子组件中错误的使用父组件数据.png

如果在子组件中强行使用父组件的数据 ,就会报错,
那么子组件如何才能获取父组件的数据呢?


2. props 属性

父组件可以使用 props 把数据传给子组件。

2.1 props基本使用

父组件在使用子组件时, 可以将父组件的数据绑定到子组件的自定义标签上,

子组件在选项中添加一个props属性来接收数据

示例代码如下:

<div id="app"><!-- 使用组件 --><my-component></my-component>
</div><!-- 子组件模板 -->
<template id="son"><div><table border="1"><tr colspan="3">子组件数据</tr><tr><td>my name</td><td>{{ myName }}</td></tr><tr><td>my age</td><td>{{ myAge }}</td></tr></table></div>
</template><!-- 父组件模板 -->
<template id="MyComponent"><div><h2>显示父组件传给子组件的数据</h2><!-- 通过两个组件的契合点,父组件通过自定义属性将数据传递给子组件 --><!-- 在属性传输数据的时候使用连字符语法 --><my-son :my-name="name" :my-age="age"></my-son></div>
</template><script>// 子组件选项let sonComponent = {// 子组件通过props接受数据并使用// 数组里放父组件中自定义属性的名字// props 里面使用驼峰写法props:["myName","myAge"],template:`#son`,}//  父组件选项对象let MyComponent = {template: `#MyComponent`,data(){return {name:"wuwei",age:18}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}//  实例中注册组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})</script>

显示结果:

父组件通过props向子组件传值.png


2.2 数据传递分类

都知道在JS中数据分为两大类,基本数据类型和引用数据类型

因此在父组件向子组件传递数据时也分为两种:为传值和传引用

传值:String Number Boolean

传引用: Array Object

那么接下来我们好好研究研究两者的不同


2.2.1 传递的是基本类型

基本类型,顾名思义,就是传递JS基本数据类型的数据

示例代码如下:

<div id="app"><conter :count="3"></conter><conter :count="4"></conter>
</div><script>var conter = {props: ['count'],template:'<div @click="handleClick">{{count}}</div>',methods:{handleClick(){//  console.log(this.count)this.count++}}}var app = new Vue({el:'#app',components:{conter}})
</script>

props传递数字.png

其实这个时候我们发现在使用子组件传递数据时并没有使用父组件data中的数据,但仍然使用了v-bind动态绑定指令
为什么呢? 不用v-bind指令就不能传递数据了吗?


答案当然不是啦, 之前有讲过, 属性如果不使用v-bind指令绑定,那么属性值将是字符串,如果使用v-bind指令绑定, 属性值虽然还是引号,但是引号中确是JavaScript表达式

因此上面的示例中我们希望的是传递数据过去,那么引号中的3 只有在JavaScript表达式中才表示数字的字面量, 因此需要v-bind指令

我们也可以尝试一下,不是用v-bind的情况

<div id="app"><!-- 不使用v-bind 指令--><conter count="3"></conter><conter count="4"></conter>
</div><script>var conter = {props: ['count'],template:'<div @click="handleClick">{{count}}</div>',methods:{handleClick(){//  console.log(this.count)this.count++}}}var app = new Vue({el:'#app',components:{conter}})
</script>

显示结果:

不使用v-bind指令传递数据.png

此时通过两个案例的对比,我们就可以发现, 使用和不使用v-bind指令的区别

也就是说不使用指令, 传递给子组件的数据将永远是字符串, 不管你写成什么样子

使用v-bind指令, 属性值引号中的内容将变成表达式,那么你就可以传递任何JS数据类型的数据

这既是Vue官网中关于props 静态传输和动态传输.

接下来我们再来看看父组件给字符串传递引用值的情况


2.2.2 传递的是引用类型的值

传引用就是传递引用类型的数据,
其实我们最想关注的是,传递引用类型的数据是数据的拷贝,还是内存地址的拷贝
因为这涉及到在子组件中是否可以通过props修改父组件中的数据

示例代码如下:

<div id="app"><child1 :aa="obj"></child1><child2 :bb="obj"></child2>
</div><script>var child1 = {props:['aa'],template:`<div>{{aa}}</div>`,mounted(){console.log(this.aa)}}var child2 = {props:['bb'],template:`<div><div>{{this.bb}}</div><button @click="handleClick">点击</button></div>`,methods: {handleClick(){this.bb.name="haha"}}}new Vue({el:'#app',data: {obj:{name: 'wuwei'}},components: {child1,child2}})
</script>

向子组件传递引用类型.png

通过示例我们发现父组件向两个不同的子组件传递了同一个引用数据类型,

两个子组件都拿到了相同的数据,也显示相同的内容,


可是在child2子组件中定义了一个按钮用于改变child2这个子组件通过props从父组件获取过来的数据

var child2 = {props:['bb'],template:`<div><div>{{this.bb}}</div><button @click="handleClick">点击</button></div>`,methods: {handleClick(){this.bb.name="haha"}}
}

点击后显示的结果:

子组件修改父组件传递的数据.png

通过示例我们就了解到,父组件向子组件传递数据时,子组件通过props 属性接受,
但请不要随意的更改props属性中的数据, 因为可能会有你意向不到的问题,

那么怎么解决这类问题呢, 接着往下看.


2.3 单向数据流

vue默认是单向数据流,所谓的单向数据流,就是数据传递是单向的

既然父组件将数据传递给了子组件,那么子组件中如果对于数据进行改变就有可能影响其他使用这数据的组件

注意:

这个只限传递基本数据类型的值,传递引用数据类型的问题上例中已经处理过

示例代码如下:

<div id="app"><!-- 使用组件 --><my-component></my-component>
</div><!-- 子组件模板 -->
<template id="son"><table border="1"><tr><th  colspan="3">子组件数据</th></tr><tr><td>my name</td><td>{{ myName }}</td><td><input type="text" v-model="myName"></td></tr><tr><td>my age</td><td>{{ myAge }}</td><td><input type="text" v-model="myAge"></td></tr></table>
</template><!-- 父组件模板 -->
<template id="MyComponent"><div><table border="1"><tr><th  colspan="3">父组件数据</th></tr><tr><td>name</td><td>{{ name }}</td><td><input type="text" v-model="name"></td></tr><tr><td>age</td><td>{{ age }}</td><td><input type="text" v-model="age"></td></tr></table><!-- 通过两个组件的契合点,父组件通过自定义属性将数据传递给子组件 --><!-- 在属性传输数据的时候使用连字符语法 --><my-son :my-name="name" :my-age="age"></my-son></div>
</template><script>// 子组件选项let sonComponent = {// 子组件通过props接受数据并使用// 数组里放父组件中自定义属性的名字// props 里面使用驼峰写法props:["myName","myAge"],template:`#son`,}//  父组件选项对象let MyComponent = {template: `#MyComponent`,data(){return {name:"wuwei",age:18}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}//  实例中注册组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})</script>

修改父组件数据:

父组件数据改变.png

修改子组件中数据,

子组件直接修改props中数据.png

通过示例测试,我们发现

  1. 当父组件数据更新时,传递给子组件的props也会更新,
  2. 当子组件修改了props的数据, 父组件不会有任何变化(基本数据类型报错,引用类型直接替换引用地址也报错, 但是直接修改属性不报错,但是不建议这么用)

这就是所谓的单项下行数据流

这么做的目的是为了防止子组件无意修改了父组件的状态


总结:

  1. 子组件不能(也不要)直接修改父组件传递过来的值,否则就会报错
  2. 修改父组件传递过来引入类型的属性不会报错,但是会导致,其他使用了这个数据的子组件里面的数据也会发生变化(这也是很大的entity)

2.4 prop响应式

通过上一个例子,我们发现父组件的数据发生变化, 子组件也会随着发生变化, 也就是,父组件在使用子组件时,给子组件prop传递的数组无论何时发生改变, 在子组件内任何使用该prop的地方都会发生更新
这就是props响应式

示例代码如下:

<div id="app"><!-- 使用组件 --><my-component></my-component>
</div><!-- 子组件模板 -->
<template id="son"><div>被点击了{{ num }}次</div>
</template><!-- 父组件模板 -->
<template id="MyComponent"><div><my-son  :num="num"></my-son><!-- 每次点击更改父组件data中的数据, 子组件prop关联的数据也会跟随发生改变--><button @click="handleClick">点击+1</button></div>
</template><script>// 子组件选项let sonComponent = {// 子组件通过props接受数据并使用props:["num"],template:`#son`,}//  父组件选项对象let MyComponent = {template: `#MyComponent`,data(){return {num: 1}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent},methods:{handleClick(){this.num++}}}//  实例中注册组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})
</script>

点击结果

props的响应式.png


3. 如何修改数据

上一小节学习我们已经知道了:

  1. 父组件可以向子组件传递基本数据类型引用数据类型的数据
  2. 子组件如果直接修改props中的基本数据类型数据和引用类型数据的内存地址就报错
  3. 如果修改引用类型数据里的值虽然不会报错,但是这样非常不友好
  4. 因此不推荐在子组件直接修改props数据中的数据

可是有的是需要修改传递过来的数据,那么如何解决这样的需求呢?

其实我们可以将父组件传递过来的值赋值给组件自己的数据,这样我们就可以修改自己的数据了


3.1 子组件修改基本数据

示例代码如下:

var conter = {props: ['count'],data(){return {num: this.count}},template:'<div @click="handleClick">{{num}}</div>',methods:{handleClick(){//  console.log(this.num)this.num++}}
}

3.2 子组件修改引用类型

如果父组件向子组件传递的引用数据类型的数据,我们按照基本数据类型那种直接将数据赋值给子组件自己的数据就行不同了,因为赋值给自己的数据也是内存地址的赋值,因此直接赋值,修改还是会改变父组件的数据. 那么要怎么办嗯?

其实我们可以在子组件内的data属性中浅拷贝一份父组件传递过来的引用数据类型,子组件如果想修改自己的显示,就修改自己data中的数据

将上面例子中child2子组件修改为如下代码

var child2 = {props:['bb'],// 在自己的data数据中浅拷贝一份父组件传过来的引用数据data(){return {cc: JSON.parse(JSON.stringify(this.bb))}},// 在自己的视图中显示自己的数据template:`<div><div>{{cc}}</div><button @click="handleClick">点击</button></div>`,// 如果有修改就修改自己data中的数据methods: {handleClick(){this.cc.name="haha"}}
}

点击结果:

子组件拷贝父组件数据.png

这样就可以在子组件中使用自己的数据,修改自己的数据, 进而解决问题


4. Prop 验证

我们可以为组件的 prop 指定验证规则。如果传入的数据不符合要求,Vue 会发出警告。这对于开发给他人使用的组件非常有用。

要指定验证规则,需要用对象的形式来定义 prop,而不能用字符串数组:


4.1 验证父组件传递过来的数据类型

// 子组件选项
let sonComponent = {// props 验证数据类型props:{myName:String,myAge: Number},template:`#son`,
}

如果数据类型验证通过, 则正常运行,如果验证不通过,则报错


4.2 允许数据传递多种数据类型

如果一个数据可以接受多种数据类型,则使用数组将所有允许的类型罗列在一起

// 子组件选项
let sonComponent = {// props 验证数据类型props:{myName:String,myAge: [Number,String]},template:`#son`,
}

这样myAge 在接受的数据是Number 类型或String 都不会报错


注意:

这两种验证数据的类型,只验证父组件传递过来数据的类型是否符合, 并不关心用户是否传数据过来, 不传也不会报错,

那么type属性都可以指定哪些类型呢?


4.3 type类型

验证类型的type属性的值就是原生的构造器(构造函数)

  • String
  • Number
  • Boolean
  • Function
  • Object
  • Array
  • Symbol

4.4 必须传递的数据

有的时候我们需要指定一些数据为必须传递的, 如果不传递就会报错, 这个时候,数据的只是一个对象

对象就是对于props传递数据的配置对象

验证的配置对象中

  1. type: 验证数据类型
  2. required: 验证数据是否为必须传递,true,是必须传递,不传就报错
// 子组件选项
let sonComponent = {props:{myName:String,myAge: {type:Number,   // type为验证数据类型required: true  // required为数据是否必须传递,true是false 否}},template:`#son`,
}

4.5 指定默认值

如果父组件未传递数据过来,则使用默认值

注意:

配置对象中required 必传选项 和 default 默认值选项,不能同时使用

默认是就是父组件在未传递数据的时候使用, 如果你还需要父组件必须传递数据, 默认值就不没有意义了吗

// 子组件选项
let sonComponent = {props:{myName:{type: String,    // 验证类型default: '默认姓名'   // 默认值},myAge: {type:Number,   // type为验证数据类型required: true  // required为数据是否必须传递,true是false 否}},template:`#son`,
}

如果传递过来的是是引用类型, 那么在定义默认值的时候必须是一个函数,函数返回引用类型的数据
为什么是一个函数就不用在说吧,和组件数据data是函数同一个意思, 保存每次传递都是第一无二的数据

示例代码如下

let sonComponent = {props:{myName:{type: String,    // 验证类型default: '默认姓名'   // 可以赋予默认值,如果父组件没有传值,使用默认值},myAge: {type:Number,   // type为验证数据类型required: true  // required为数据是否必须传递,true是false 否//  此属性表示必须传值,但是不能跟default同用},myLike:{type:Array,       // 限定的数据类型是引用类型的数组default: function(){   //如果传递过来的是一个引用类型的值,默认值是函数return []   }}},template:`#son`,
}

4.6 自定义验证规则

自定义验证是一个函数,返回true则验证通过,返回false则验证不通过

示例代码如下:

let sonComponent = {// 子组件通过props接受数据并使用// 数组里放父组件中自定义属性的名字// props 里面使用驼峰写法props:{myName:{type: String,    // 验证类型default: '默认姓名'   // 默认值},myAge: {    validator:function(value){ //   自定义验证器return value > 16        // 返回true 验证通过, 返回false 验证不通过报错}}},template:`#son`,
}

注意

props 会在组件实例创建之前进行校验,

所以在 defaultvalidator 函数里,诸如 datacomputedmethods 等实例属性都还无法使用。

props特性就是父组件通过属性传值,子组件有对应的props接受,那么这个属性不会出现在网页的标签属性上


5. 非Props 特性

5.1 非prop 属性的了解

尽管为组件定义明确的 props是推荐的传参方式,组件的作者却并不总能预见到组件被使用的场景。
所以,组件可以接收任意传入的特性,这些特性都会被添加到组件的根元素上。

简单的说就是父组件可以在使用子组件的时候给子组件传递n多的属性, 只有子组件使用props接受的才会成为子组件的参数, 没有通过props声明的属性就是非props, 这些属性会自动添加为子组件根标签的属性

通过示例了解:

<div id="app"><!-- 使用组件 --><my-component></my-component>
</div><!-- 子组件模板 -->
<template id="son"><div>{{msg}}</div>
</template><!-- 父组件模板 -->
<template id="MyComponent"><div><!-- msg因为子组件prop定义了所以会成为子组件的参数 --><!-- title属性因为子组件没有在props声明,所以是非prop, 会自动添加为 子组件根标签的属性--><my-son  :msg="msg" :title="title"></my-son></div>
</template><script>// 子组件选项let sonComponent = {// 子组件通过props接受数据并使用props:["msg"],template:`#son`,}//  父组件选项对象let MyComponent = {template: `#MyComponent`,data(){return {msg:"我想说一句话",title:"标题"}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}//  实例中注册组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})
</script>

显示结果

非props.png

在总结一下:

非props就是子组件并没有明确props来接受父组件的传值,那么在网页中子组件传值的属性将会成为标签的私有属性


上面一个例子,了解到如果父组件给子组件传递非prop属性,会自动成为子组件模板中根标签的标签属性, 适用于任何HTML属性或特性,

可是如果父组件传递的非prop属性与子组件的根标签的属性重名了怎么办呢?

会发生两种情况, 一,替换,二合并, 先来看看替换的情况


5.2 非prop属性的替换

如果父组件传递的prop属性与子组件的根标签的属性重名,大部分情况会覆盖子组件根标签上的同名属性. 即替换效果

示例代码如下:

<div id="app"><!-- 使用组件 --><my-component></my-component>
</div><!-- 子组件模板 -->
<template id="son"><!-- 子组件根标签的type属性值text 被父组件传递过了的非prop type属性值 radio替换了 --><input type="text" />
</template><!-- 父组件模板 -->
<template id="MyComponent"><div><!-- 父组件向子组件传递非prop属性 type 值为radio --><my-son  :type="type"></my-son></div>
</template><script>// 子组件选项let sonComponent = {// 子组件通过props接受数据并使用props:["num"],template:`#son`,}//  父组件选项对象let MyComponent = {template: `#MyComponent`,data(){return {type: "radio"}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}//  实例中注册组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})
</script>

显示结果

非props属性替换.png

通过示例.发现: 子组件根标签的type属性值text 被父组件传递过了的非props type属性值 radio替换了

这样的效果非常不好,可能会破坏子组件. 所以一定要注意.


5.3 非prop属性的合并

当然了大部分会发生替换, 但是也有两个特殊的属性,会发生合并的效果,这两个属性就是classstyle属性

示例:

<div id="app"><!-- 使用组件 --><my-component></my-component>
</div><!-- 子组件模板 -->
<template id="son"><div class="box" style="background:skyblue;">我是子组件 </div>
</template><!-- 父组件模板 -->
<template id="MyComponent"><div><my-son  :class="className" :style="style"></my-son></div>
</template><script>// 子组件选项let sonComponent = {// 子组件通过props接受数据并使用props:["num"],template:`#son`,}//  父组件选项对象let MyComponent = {template: `#MyComponent`,data(){return {className: "wrap",style: {width: '100px',height: '100px'}}},// 将子组件定义为父组件的局部组件components: {mySon: sonComponent}}//  实例中注册组件const vm = new Vue({el:"#app",components: {"MyComponent": MyComponent}})</script>

非props属性合并.png

示例中,父组件通过非prop传递过去的class 和style属性 与子组件根标签的class 和 style 属性发生合并.


6. 遍历传值,

利用v-for循环指令. 多次使用组件.

在配合使用 v-bind 指令将数据传到每个组件中:

<div id="app"><ol><!--现在我们为每个 todo-item 传递了数据,即其内容可以是动态的。我们也需要为每个组件提供一个“key”,稍后再作详细解释。--><todo-itemv-for="item in groceryList"v-bind:text="item.text"v-bind:key="item.id"></todo-item></ol>
</div><script>// 定义子组件let todoItem = {props:["text"],template:`<li>{{text}}</li>`}// Vue实例var vm = new Vue({el: '#app',data: {groceryList: [{ id: 0, text: '蔬菜' },{ id: 1, text: '奶酪' },{ id: 2, text: '随便其它什么人吃的东西' }]},components:{todoItem}})</script>

显示结果

循环组件配合props使用.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…

VSCODE常用插件记录

重点提名&#xff1a; back & ForthBookmarksC/ChighlightSSH FS //SSH插件

JVM之垃圾判断的详细解析

垃圾判断 垃圾介绍 垃圾&#xff1a;如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾 作用&#xff1a;释放没用的对象&#xff0c;清除内存里的记录碎片&#xff0c;碎片整理将所占用的堆内存移到堆的一端&#xff0c;以便 JVM 将整理出的内…

第3章 数据链路层

王道学习 考纲内容 &#xff08;一&#xff09;数据链路层的功能 &#xff08;二&#xff09;组帧 &#xff08;三&#xff09;差错控制 检错编码&#xff1b;纠错编码 &#xff08;四&#xff09;流量控制与可靠传输机制 流量控制、可靠传输与滑动窗口…

AcWing 1600:完全二叉树

【题目来源】https://www.acwing.com/problem/content/1602/【题目描述】 给定一个树&#xff0c;请你判断它是否是完全二叉树。【输入格式】 第一行包含整数 N&#xff0c;表示树的结点个数。 树的结点编号为 0∼N−1。 接下来 N 行&#xff0c;每行对应一个结点&#xff0c;并…

3dmax渲染经常卡主?关掉光追即可流畅渲染

3ds Max是一款广泛应用于三维建模、动画和渲染的软件&#xff0c;它在影视、游戏、建筑可视化等领域具有重要地位。在3ds Max中&#xff0c;渲染技术的选择和应用直接影响到最终图像的质量和渲染效率。 但在实际使用过程中&#xff0c;由于3dsMax中有太多选项&#xff0c;很多…

# 解决 win11 连接共享打印机,报错 0x00000709 问题

解决 win11 连接共享打印机&#xff0c;报错 0x00000709 问题 一、问题描述&#xff1a; 当我们连接一台共享打印机&#xff0c;出现报错 0x00000709 时&#xff0c;这是由于本机注册表本配置 RPC 远程调用&#xff0c;我们需要对自己的电脑进行修改&#xff0c;而不是主机&a…

什么是 ISP 代理?

代理是路由互联网流量的中间服务器&#xff0c;通常分为三类&#xff1a;数据中心、住宅和 ISP。根据定义&#xff0c;ISP 代理隶属于互联网服务提供商&#xff0c;但实际上&#xff0c;更容易将它们视为数据中心和住宅代理的组合。 让我们仔细研究一下 ISP 代理&#xff0c;看…

国产操作系统上部署SVN版本控制系统

原文链接&#xff1a;国产操作系统上部署SVN版本控制系统 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上部署SVN版本控制系统的文章。SVN&#xff08;Subversion&#xff09;是一款广泛使用的版本控制系统&#xff0c;它…

【一步一步了解Java系列】:类与对象的联系

看到这句话的时候证明&#xff1a;此刻你我都在努力加油陌生人个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭 对…

真实故障分享,H3C ER3208G3-X路由器-双绞线一闪一停

六类非屏蔽双绞线 网线钳 如上图所示&#xff0c;2号线接到h3c路由器出现网线一闪一停&#xff0c;用对线器测试一到8芯能一一对应&#xff0c;无法上网。2号线接到h3c交换机能正常上网&#xff0c;难道是网线对568A 568B有要求&#xff1f; 解决方式&#xff1a;通过两端568…

一文讲清楚:如何做好建设工程项目管理?

在房地产开发中&#xff0c;作为项目负责人我目前的状况成了一个大管家&#xff0c;还要管理工程质量。上至各部门领导的关系维护&#xff0c;下到工人的吃喝拉撒都要我操心&#xff0c;还要没完没了的处理四邻纠纷和拆迁户的纠纷&#xff0c;每天都搞得很疲惫&#xff0c;如何…

elementUI type=“selection“多选框选中 删除 回显 赋值问题 回显数组改变选中状态未改变

业务需求&#xff1a; 点击查询弹列表框 勾选列表选项保存 可删除可重新查询列表添加 遇到的问题&#xff1a;删除之后查询列表selection回显问题 解决&#xff1a;row-click配合:reserve-selection"true"使用 <el-tableref"refPlanTable":data"…

vue3 + ts 实现IP地址及Mac地址输入框功能

1、组件完成代码 <template><div class"ip-input"><div v-for"(item, index) in ipArr" :key"index" class"ip-input__item-wrap"><input ref"ipInput" v-model"ipArr[index]" type"t…

【Python Cookbook】S01E01 将长度为N的序列分解为N个单独的变量

目录 问题解决方案讨论 问题 将一个包含 N N N 个元素的元组或者序列&#xff0c;现在想将其分解为 N N N 个单独的变量。 解决方案 任何序列都可以通过简单的赋值操作分解为单独的变量&#xff1a; p (4, 5) x, y p print("x", x) print("y", y)唯…

现在怎么做抖店才能赚钱?这四个重要建议,你千万不能忽略!

大家好&#xff0c;我是电商花花。 现在目前看抖音小店前景和红利依然有很大的市场空间&#xff0c;抖音小店平台流量大&#xff0c;商家入驻门槛低&#xff0c;抖店的运营技术也不像其它传统电商平台那么高。 所以&#xff0c;当下抖音小店仍然是流量大&#xff0c;机遇多。…

近屿OJAC带你解读:什么是API?

API的定义 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。 是…

【Linux】网络高级IO

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;五种IO模型&#x1f449;&#x1f3fb;消息通信的同步异步与进程线程的同步异步有什么不同&#xff1f;&#x1f449…

远程工作利器:高效指南教你如何在Linux服务器上部署Jupyter Notebook并实现安全远程访问

远程工作利器&#xff1a;高效指南教你如何在Linux服务器上部署Jupyter Notebook并实现安全远程访问 1.安装 Anaconda和python 你可以在终端中运行以下命令来检查是否已安装&#xff1a; python --version python3 --version安装 pip pip 是 Python 的包管理工具&#xff0c…

长方形边框 上方中间有缺口 css

<div class"text_6">大234234师掌4234柜</div><div class"text-wrapper_1"><span class"paragraph_1">四川慧创云戈科技有限公司推出的“大师掌柜”&#xff0c;是一个以餐饮外卖为切入口&#xff0c;专注实体小店新零售…