都快2024年了,别只使用React,需要学习一下Vue,不然没出路了

news2024/12/23 19:31:17

最近,我的朋友因为不熟悉 Vue.js 而未能通过面试。

她平时工作中大部分时间都在使用React,所以也懒得去了解其他前端框架。

世界上所有的前端框架我们都应该熟悉吗?

不,这是极其不合理的。

但为了生存,朋友还是要学习Vue的框架。

让我们看看如何使用 Vue 来实现 React 的一些功能。

1. v-if:如何显示和隐藏元素?

控制元素或组件的显示和隐藏是我们最常见的事情之一,在React中,我们经常这样编码。

JavaScript 中的三元表达式和“&”也可以实现同样的目标。

React
import React, { useState } from "react"


export default function Vif (){
  const [ isShow, setIsShow ] = useState(true)
  const onToggleShow = () => {
    setIsShow(!isShow)
  }
  return (
    <div className="v-if">
      <button onClick={ onToggleShow }>Toggle</button>
      {/* Of course you can also use ternary expressions */}
      {/* isShow ? <div>fatfish has shown</div> : null */}
      {
        isShow && <div>fatfish has shown</div>
      }
    </div>
  )
}
Vue

那么在Vue中如何实现同样的功能呢?

是的,我们可以使用 v-if 指令来控制元素的显示和隐藏,这很简单,不是吗?

<template>
  <div class="v-if">
    <button @click="onToggleShow">Toggle</button>
    <div v-if="isShow">fatfish has shown</div>
  </div>
</template>
<script>
export default {
  name: 'vif',
  data () {
    return {
      isShow: true
    }
  },
  methods: {
    onToggleShow () {
      this.isShow = !this.isShow
    }
  }
}
</script>

2. v-show:如何显示和隐藏元素?

v-if 导致元素或组件被重复删除和创建,如果我们只想“显示”或“隐藏”它怎么办?

也许我们可以借助 CSS 中的 display 属性来做到这一点。

React
import React, { useState } from "react"


export default function VShow (){
  const [ isShow, setIsShow ] = useState(true)
  const onToggleShow = () => {
    setIsShow(!isShow)
  }
  return (
    <div className="v-show">
      <button onClick={ onToggleShow }>Toggle</button>
      {
        <div style={{ display: isShow ? '' : 'none' }}>fatfish has shown</div>
      }
    </div>
  )
}
Vue

你可能已经猜到了,我们可以使用 v-show 来实现与它相同的功能。看起来 Vue 更简洁,你不觉得吗?

<template>
<div class="v-show">
    <button @click="onToggleShow">Toggle</button>
    <div v-show="isShow">fatfish has shown</div>
  </div>
</template>
<script>
export default {
  name: 'vshow',
  data () {
    return {
      isShow: true
    }
  },
  methods: {
    onToggleShow () {
      this.isShow = !this.isShow
    }
  }
}
</script>

3. v-for:渲染列表?

在React中,我们可以使用数组的map方法来创建列表,这非常简单。

看一下这段代码,它创建了三个不同职业的列表。

React
import React, { useState } from "react"


export default function VFor (){
  const [ list, setList ] = useState([
    {
      id: 1,
      name: 'Front end',
    },
    {
      id: 2,
      name: 'Android',
    },
    {
      id: 3,
      name: 'IOS',
    },
  ])
  return (
    <div className="v-for">
      {
        list.map((item) => {
          return <div key={ item.id } className="v-for-item">{ item.name }</div>
        })
      }
    </div>
  )
}
Vue

你喜欢 Vue 中的 v-for 指令吗?

<template>
  <div class="v-for">
    <div class="v-for-item" v-for="item in list" :key="item.id">
      {{ item.name }}
    </div>
  </div>
</template>
<script>
export default {
  name: "vfor",
  data() {
    return {
      list: [
        {
          id: 1,
          name: "Front end",
        },
        {
          id: 3,
          name: "Android",
        },
        {
          id: 4,
          name: "IOS",
        },
      ],
    };
  },
};
</script>

4. 计算

如果我们想计算两个数的和,有什么好的方法吗?

我的意思是,当 num1 和 num2 发生变化时,它们的总和会自动变化,我们不需要手动处理。

React
import React, { useMemo, useState } from "react"


export default function Computed (){
  const [ num1, setNum1 ] = useState(10)
  const [ num2, setNum2 ] = useState(10)
  const num3 = useMemo((a, b) => {
    return num1 + num2
  }, [ num1, num2 ])
  const onAdd = () => {
    setNum1(num1 + 10)
  }
  return (
    <div className="computed">
      <button onClick={ onAdd }>+10</button>
      <div>result:{ num3 }</div>
    </div>
  )
}

哇,太棒了,useMemo 帮我们解决了一个问题。

Vue

那么,Vue中有没有更好的实现呢?它实际上提供了一种称为“计算”的机制,该机制更智能且更易于使用。

<template>
  <div class="computed">
    <button @click="onAdd">+10</button>
    <div>result:{{ num3 }}</div>
  </div>
</template>
<script>
export default {
  name: 'computed',
  data () {
    return {
      num1: 10,
      num2: 10,
    }
  },
  computed: {
    num3 () {
      return this.num1 + this.num2
    }
  },
  methods: {
    onAdd () {
      this.num1 += 10
    }
  }
}
</script>

5.watch

当我们需要监听数据变化然后执行回调函数时,可以在React中使用useEffect来完成。

让我们尝试模拟一个场景:

我们点击男孩或女孩按钮,选中时发送请求,最后显示请求结果(我们通过setTimeout模拟异步请求过程)。

React
export default function Watch() {
  const [fetching, setFetching] = useState(false)
  const [selects, setSelects] = useState([
    'boy',
    'girl'
  ])
  const [selectValue, setSelectValue] = useState('')
  const result = useMemo(() => {
    return fetching ? 'requesting...' : `the result of the request: ${selectValue || '~'}`
  }, [ fetching ])
  const onSelect = (value) => {
    setSelectValue(value)
  }
  const fetch = () => {
    if (!fetching) {
      setFetching(true)
      setTimeout(() => {
        setFetching(false)
      }, 1000)
    }
  }
  // Pay attention here
  useEffect(() => {
    fetch()
  }, [ selectValue ])
  return (
    <div className="watch">
      <div className="selects">
        {
          selects.map((item, i) => {
            return <button key={ i } onClick={ () => onSelect(item) }>{ item }</button>
          })
        }
      </div>
      <div className="result">
        { result }
      </div>
    </div>
  )
}
Vue

别担心,我们可以在 Vue 中做同样的事情,你知道它的秘密是什么吗?

是的,答案是watch。

<template>
  <div class="watch">
    <div class="selects">
      <button 
        v-for="(item, i) in selects"
        :key="i"
        @click="onSelect(item)"
      >
        {{ item }}
      </button>
    </div>
    <div class="result">
      {{ result }}
    </div>
  </div>
</template>
<script>
export default {
  name: 'watch',
  data () {
    return {
      fetching: false,
      selects: [
        'boy',
        'girl'
      ],
      selectValue: ''
    }
  },
  computed: {
    result () {
      return this.fetching ? 'requesting...' : `the result of the request: ${this.selectValue || '~'}`
    }
  },
  // Pay attention here
  watch: {
    selectValue () {
      this.fetch()
    }
  },
  methods: {
    onSelect (value) {
      this.selectValue = value  
    },
    fetch () {
      if (!this.fetching) {
        this.fetching = true
        setTimeout(() => {
          this.fetching = false
        }, 1000)
      }
    }
  }
}
</script>
<style>
button{
  margin: 10px;
  padding: 10px;
}
</style>

6. style

有时我们需要动态地向元素添加样式,Vue 和 React 都为我们提供了一种便捷的使用方式。

从用途上来说,它们基本上是相似的。

相同点:

CSS 属性名称可以是驼峰命名法或短横线命名法(记住将它们用引号引起来)

差异:

  • 在Vue中,我们可以通过数组语法绑定多个样式对象,React主要是单个对象的形式(这一点Vue也可以)
  • 在React中,对于属性的数量,它会自动给内联样式添加“px”(这一点Vue不会自动处理)后缀,其他单位需要手动指定
  • 在 React 中,样式不会自动添加前缀。当 v-bind:style 使用需要浏览器引擎前缀的 CSS 属性时,例如 Transform,Vue.js 会自动检测并添加相应的前缀。

React
import React from "react"


export default function Style (){
  const style = {
    width: '100%',
    height: '500px',
  }
  const style2 = {
    backgroundImage: 'linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%)',
    borderRadius: '10px',
  }
  return (
    <div className="style" style={ { ...style, ...style2 } } ></div>
  )
}
Vue
<template>
  <div class="style" :style="[ style, style2 ]"></div>
</template>
<script>
export default {
  name: 'style',
  data () {
    return {
      style: {
        width: '100%',
        height: '500px',
      },
      style2: {
        backgroundImage: 'linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%)',
        borderRadius: '10px',
      }
    }
  }
}
</script>

7.class

我们应该如何动态地为元素添加类?

在Vue中,我更喜欢使用数组语法(当然也有对象方式),在React中也可以使用一些第三方包比如classnames来起到更方便的方式来添加类的效果。

React
import React, { useMemo, useState } from "react"


import './class.css'
export default function Class (){
  const [ isActive, setIsActive ] = useState(false)
  const buttonText = useMemo(() => {
    return isActive ? 'Selected' : 'UnSelected'
  }, [ isActive ])
  const buttonClass = useMemo(() => {
    return [ 'button', isActive ? 'active' : '' ].join(' ')
  }, [ isActive ])
  const onClickActive = () => {
    setIsActive(!isActive)
  }
  return (
    <div className={ buttonClass } onClick={onClickActive}>{ buttonText }</div>
  )
}
Vue
<template>
  <button :class="buttonClasses" @click="onClickActive">{{ buttonText }}</button>
</template>
<script>
export default {
  name: 'class',
  data () {
    return {
      isActive: false,
    }
  },
  computed: {
    buttonText () {
      return this.isActive ? 'Selected' : 'UnSelected'
    },
    buttonClasses () {
      return [ 'button', this.isActive ? 'active' : '' ]
    }
  },
  methods: {
    onClickActive () {
      this.isActive = !this.isActive
    }
  }
}
</script>
<style scoped>
.button{
  display: block;
  width: 100px;
  height: 30px;
  line-height: 30px;
  border-radius: 6px;
  margin: 0 auto;
  padding: 0;
  border: none;
  text-align: center;
  background-color: #efefef;
}
.active{
  background-image: linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%);
  color: #fff
}
</style>

8. provide/inject

Vue 和 React 对于全局状态的管理都有自己很好的解决方案,比如 Vue 中的 Vuex、Redux 中的 React 和 Mobx,但是,当然,这些小项目的引入对于小用途来说有点太大了,就没有其他解决方案?

provide/inject可以在Vue中使用

React 可以使用 Context

假设我们有一个用于用户信息的全局变量“userInfo”,需要在每个组件中轻松访问它,如何在Vue和React中实现它?

React 

为了在 React 中实现这一点,您可以借助 Context 将全局状态共享给任何子节点。

上下文/index.js

import { createContext } from "react";
export const UserInfoContext = createContext({
  userInfo: {
    name: ''
  }
})
App.js
import { UserInfoContext } from './context/index'


function App() {
  return (
    <BrowserRouter>
      // Pay attention here
      <UserInfoContext.Provider
        value={{ userInfo: { name: 'fatfish' } }}
      >
        <div className="title">I am React App</div>
        <Routes>
          <Route path="/v-if" element={<Vif />} />
          <Route path="/v-show" element={<VShow />} />
          <Route path="/v-for" element={<VFor />} />
          <Route path="/computed" element={<Computed />} />
          <Route path="/watch" element={<Watch />} />
          <Route path="/style" element={<Style />} />
          <Route path="/class" element={<Class />} />
          <Route path="/slot" element={<Slot />} />
          <Route path="/nameSlot" element={<NameSlot />} />
          <Route path="/scopeSlot" element={<ScopeSlot />} />
          <Route path="/provide" element={<Provide />} />
        </Routes>
      </UserInfoContext.Provider>
    </BrowserRouter>
  );
}
provide.js
import React, { useContext } from "react"
import { UserInfoContext } from '../context/index'


export default function Provide() {
  // We can use the defined "UserInfoContext" through the userContext
  const { userInfo } = useContext(UserInfoContext)
  return (
    <div class="provide-inject">{ userInfo.name }</div>
  )
}
Vue

在Vue中,我们可以使用“provide/inject”将顶级状态传递给任何子节点,假设我们在app.vue中声明一个“userInfo”数据。

App.vue
<template>
  <div id="app">
    <div class="title">I am Vue App</div>
    <router-view/>
  </div>
</template>
<script>
export default {
  name: 'app',
  // Pay attention here
  provide () {
    return {
      userInfo: {
        name: 'fatfish'
      }
    }
  }
}
</script>
provide.vue
<template>
  <div class="provide-inject">{{ userInfo.name }}</div>
</template>
<script>
export default {
  name: 'provideInject',
  // Use data
  inject: [ 'userInfo' ]
}
</script>

9. Slots

假设我们要实现一个简单的对话组件,基本功能是标题可以作为字符串传递,内容部分可以完全自定义,我们应该如何实现呢?

React

虽然React中没有槽的概念,但是可以通过props.children获取组件内部的子元素,通过这个可以实现默认的槽。

Dialog.js
import React, { useState, useEffect } from "react"
import './dialog.css'


export default function Dialog(props) {
  // Forgive me for implementing this in a silly way like visible -1 first, but that's not the point
  const { children, title = '', visible = -1 } = props
  const [visibleInner, setVisibleInner] = useState(false)
  const onHide = () => {
    setVisibleInner(false)
  }
  useEffect(() => {
    setVisibleInner(visible > 0)
  }, [ visible ])
  return (
    <div className="dialog" style={ { display: visibleInner ? 'block' : 'none' }}>
      <div className="dialog-mask" notallow={ onHide }></div>
      <div className="dialog-body">
        { title ? <div className="dialog-title">{ title }</div> : null }
        <div className="dialog-main">
          {/* Note here that the default slot function is implemented via children */}
          {children}
        </div>
        <div className="dialog-footer">
          <div className="button-cancel" notallow={ onHide }>Cancel</div>
          <div className="button-confirm" notallow={ onHide }>Confirm</div>
        </div >
      </div >
    </div >
  )
}
slot.js
import React, { useState, useEffect } from "react"
import Dialog from './components/dialog'


export default function Slot() {
  const [visible, setVisible] = useState(-1)
  const onToggleVisible = () => {
    setVisible(Math.random())
  }
  return (
    <div className="slot">
      <button onClick={ onToggleVisible }>Toggle</button>
      <Dialog
        visible={visible}
        title="default slot"
      >
        {/* Note that here, it will be read and replaced by the children of the Dialog component */}
        <div className="slot-body">fatfish</div>
      </Dialog>
    </div>
  )
}
Vue

同样的功能在Vue中应该如何实现呢?

dialog.vue
<template>
  <div class="dialog" v-show="visible">
    <div class="dialog-mask" @click="onHide"></div>
    <div class="dialog-body">
      <div class="dialog-title" v-if="title">{{ title }}</div>
      <div class="dialog-main">
        <!-- Note: A default slot has been placed here -->
        <slot></slot>
      </div>
      <div class="dialog-footer">
        <div class="button-cancel" @click="onHide">Cancel</div>
        <div class="button-confirm" @click="onHide">Confirm</div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: "dialog",
  props: {
    title: {
      type: String,
      default: "",
    },
    visible: {
      type: Boolean,
      default: false,
    },
  },
  methods: {
    onHide () {
      this.$emit('update:visible', false)
    }
  }
};
</script>
slot.vue
<template>
  <div class="slot">
    <button @click="onToggleVisible">切换dialog</button>
    <Dialog
      :visible.sync="visible"
      title="default slot"
    >
    <!-- The <slot></slot> will be replaced here -->
    <div class="slot-body">fatfish</div>
    </Dialog>
  </div>
</template>
<script>
import Dialog from './components/dialog.vue'
export default {
  name: 'slot',
  components: {
    Dialog,
  },
  data () {
    return {
      visible: false
    }
  },
  methods: {
    onToggleVisible () {
      this.visible = !this.visible
    }
  }
}

写在最后

不管是开发语言,还是开发框架,都是我们实现创造产品的工具,最终,我们能够实现什么样的效果,做出什么样的产品,都是依赖实现它的人。

作为技术人,多学技术没有错,但是不能为了学习技术而学习技术,我们学习技术的目的,是要解决一些问题,这个是我对学习技术的一些感悟。

当然,也希望我今天分享的内容,对你有用。

最后,基于Vue3.0的优秀低代码项目

JNPF开发平台。近年在市场表现和产品竞争力方面表现较为突出,采的是最新主流前后分离框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3)。代码生成器依赖性低,灵活的扩展能力,可灵活实现二次开发。

以JNPF为代表的企业级低代码平台为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动,还没有了解过低代码的伙伴可以尝试了解一下。

应用:https://www.jnpfsoft.com/?csdn

有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助。

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

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

相关文章

Vue事件绑定

目录 前言 Vue事件处理 指令的语法格式 事件绑定指令—v-on 回调函数 前言 我们知道如何在原生js中实现事件绑定&#xff0c;那在vue中如何实现呢&#xff1f; Vue事件处理 指令的语法格式 <标签 v-指令名&#xff1a;参数名"表达式">{{插值语法}}</…

2D 3D 工业组态技术 meta2d JavaScript

本心、输入输出、结果 文章目录 2D 3D 工业组态技术 meta2d JavaScript前言2D 3D 工业组态技术 meta2d JavaScript 简介2D 3D 工业组态技术 meta2d JavaScript 特性丰富的组态能力0代码数据通信组态的应用多端适配能力强大的扩展能力追求卓越性能丰富的组件库资源广泛的应用场景…

React Virtual DOM及Diff算法

JSX到底是什么 使用React就一定会写JSX&#xff0c;JSX到底是什么呢&#xff1f;它是一种JavaScript语法的扩展&#xff0c;React使用它来描述用户界面长成什么样子&#xff0c;虽然它看起来非常像HTML&#xff0c;但他确实是javaScript&#xff0c;在React代码执行之前&#…

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言&#xff0c;近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名&#xff0c;被广…

基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T 8051单片机定时器/计数器应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片DAC0832介绍通过按键调节数模芯片DAC0832输出模拟量控制…

ThreadLocal原理及使用场景

ThreadLocal意为线程本地变量&#xff0c;用于解决多线程并发时访问共享变量的问题 明显&#xff0c;在多线程的场景下&#xff0c;当有多个线程对共享变量进行修改的时候&#xff0c;就会出现线程安全问题&#xff0c;即数据不一致问题。常用的解决方法是对访问共享变量的代码…

dll文件【C#】

加载方法&#xff1a; [DllImport("controlcan.dll")] public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); 文件存放位置&#xff1a; 一般放Debug文件夹下。 运行错误&#xff1a; 原因是CPU位数选择不对&…

F8652X 984865265 F8652E 984865264

F8652X 984865265 F8652E 984865264 亚历克能够满足最严格的建筑规范开箱-不需要大量的定制&#xff0c;设计时间或劳动力&#xff0c;或专门的布线系统。 模块化ALEC系统包括三个简单的硬件组件——区域控制器(ZC001)、标准按钮墙板和物联网(IoT)网关。该系统可以无限扩展&…

Python高级语法----高级Python函数式编程

文章目录 1. 函数式编程概念2. 使用functools模块3. 深入理解lambda, map, filter, reduce函数a. lambda 函数b. map 函数c. filter 函数d. reduce 函数1. 函数式编程概念 函数式编程是一种编程范式,它将计算视为函数的评估,并避免使用程序状态及可变数据。在Python中,函数…

【VS Code插件开发】创建终端(八)

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! ✨优质专栏:VS Code插件开发极速入门 📢 资料领取:前端进阶资料可以找我免费领取 目录 一、createTerminal创建终端二、终端方法1、…

警方打击了大规模网络钓鱼提供商BulletProftLink

导语 最近&#xff0c;马来西亚皇家警察宣布成功打击了一个名为BulletProftLink的大规模网络钓鱼提供商。这个提供超过300个钓鱼模板的平台被查封&#xff0c;给全球网络安全带来了巨大的利好消息。本文将带您了解这个引人注目的行动背后的故事&#xff0c;并揭示BulletProftLi…

根据特定规则生成合并数据,遍历循环时会存在数据错乱等情况的问题排查(深拷贝 仅自己记录)

问题前景 在合并生成领料单&#xff0c;选择相同物料&#xff0c;合并领料&#xff0c;但因批次&#xff0c;数量不一样&#xff0c;需要单独生成一个主单据下面显示具体的物料&#xff0c;主单据的数量必须是选择单据的数量累加 错误代码演示 const temp JSON.parse(JSON…

YOLOV5中parser参数配置

源码下载链接&#xff1a;ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite (github.com) 需要配置的参数&#xff1a;--data parser.add_argument(--data, ...)&#xff1a;添加一个用于数据配置文件的路径的参数。 可以直接修改&am…

达索系统SOLIDWORKS 2024钣金和结构系统新功能

达索系统SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了&#xff0c;在2024版本中钣金和结构系统功能也做了很棒的提升。接下来让我们看看如何使用达索系统SOLIDWORKS 2024钣金和结构系统的一些新功能快速完成相应的设计。 达索系统SOLIDWORKS 2024的钣金提供了槽口延伸功能…

【C++】一维字符数组 与 二维字符数组

一维字符数组 一维字符数组 可以通过数组名直接进行整体输入和输出&#xff08;注意&#xff1a;当使用一维字符数组存储字符串时&#xff0c;因为元素尾部会有一个空字符\0,所以需要给空字符\0留一个位置&#xff09; char a[5]; cin>>a; cout<<a;二维字符数组 …

通过ping来测试网络带宽

在windows下通过 ping -l 5000 192.168.31.1 其中5000为设置ping的单个包的大小 192.168.31.1为目的地地址 假设ping 5000字节平均耗费1ms而ping 45000字节平均耗费4ms&#xff0c;因此&#xff0c;往返额外花费3ms单程额外花费1.5ms&#xff0c;多发送40000字节即320000比特…

[文件读取]GoCD 任意文件读取漏洞 (CVE-2021-43287)

1.1漏洞描述 漏洞编号CVE-2021-43287漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: GoCD 一款先进的持续集成和发布管理系统,由ThoughtWorks开发。&#xff08;不要和Google的编程语言Go混淆了&#xff01;&#xff09;其前身为CruiseControl,是ThoughtWorks在…

MySQL--MHA高可用

MHA相关知识 1.什么是MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件MHA 的出现就是解决MySQL 单点故障的问题。目的&#xff1a;MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。MH…

揭秘软件测试培训骗局:如何从贩卖焦虑到高薪包就业

你可能并不是一个IT行业的从业者&#xff0c;也可能是第一次听说软件测试工程师这个岗位。但由于看了某个网站的广告&#xff0c;或者听某个人说可以花钱培训软件测试技术&#xff0c;入职软件测试工程师岗位&#xff0c;于是动了这方面的心思。 但是互联网上有很多地方说&…

Kstry: 业务架构的首选之选

在当今数字化时代&#xff0c;构建稳健且高效的业务架构对于企业的成功至关重要。Kstry作为一种创新性的技术架构&#xff0c;已经在各个领域展现出卓越的表现。本文将探讨为何Kstry被视为业务架构的首选&#xff0c;并介绍其独特的特点和优势。 引言 业务架构是指基于企业战略…