actions的使用详解

actions的使用详解
为何要有actions环节

我们之前学了vuex状态管理,组件可以引用state,但是不能直接修改state,比如发送操作到actions,在此执行异步操作,然后再提交mutation来修改state.如果没有异步操作可以直接提交到mutation跳过actions步骤。

在mutation这里devtools插件可以用来监控state状态改变记录。如果有异步操作不通过actions直接到mutations就会无法捕捉。

所以mutaions中的方法必须是同步方法,不能有异步操作

updateInfo(state) {
  setTimeout(()=>{
      state.info.name='v587'
  },1000)
}

在之前的更新信息方法内写上定时器模拟异步操作

在这里插入图片描述

这就是在mutations里写异步操作的弊端。

增加actions环节

增加不是替代,不要试图在action里直接操作state,那样就是替代了mutation的工作。我们只是为了将异步操作分离开来,放到此处单独处理。

所以getters和mutations的默认参数都是state,而actions参数确是context

具体的步骤

组件发送请求给actions

updateInfo() {
  //this.$store.commit('updateInfo')
  this.$store.dispatch('aUpdateInfo')
}

当然也可以发送参数跟在函数名后,或者直接将dispatch参数写成对象形式。

和mutations提交规则是一样的。

updateInfo(count) {
  //this.$store.commit('updateInfo')
  this.$store.dispatch({
    type:'aUpdateInfo',
     count
  })
}
actions执行异步操作后提交到mutations
actions: {
  //默认参数context:上下文
  aUpdateInfo(context,count){
    setTimeout(()=>{
      context.commit('updateInfo')
      console.log(count.count)
    },1000)
  }
},
mutations修改state
   updateInfo(state) {
      state.info.name='qcl'
    }
有一个需求

我们异步操作,修改成功后,要告诉组件已经修改成功,然后组件进行下一步操作。当我们在actions里commit的时候如果没有报错,就可以认为提交成功。

我们此时可以直接在组件里调用actions方法时传入一个函数

updateInfo(count) {
  //this.$store.commit('updateInfo')
  this.$store.dispatch({
    type:'aUpdateInfo',
     count,
    success:()=>console.log('完成异步操作')
  })
}
actions: {
  //默认参数context:上下文
  aUpdateInfo(context,count){
    setTimeout(()=>{
      context.commit('updateInfo')
      console.log(count.count)
      count.success()
    },1000)
  }
},

如果异步操作成功后回调success函数即可。

记住如果dispatch和commit方法参数都是对象,那么接受的方法的参数也是对象。

那这样不又是之前的问题,异步操作代码和业务代码放到了一起,显得结构十分杂乱。

我们不是学过promise吗

aUpdateInfo(context,count){
 new Promise(resolve => {
    setTimeout(()=>{
      context.commit('updateInfo')
      resolve(count)
    },1000)
  }).then(res=>{
    console.log(res.count)
     res.success()
  })
}

然后用promise将异步操作和回调分开

我写的还是不够优雅,既然回调函数是为了让组件知道,commit成功,自然要在外边执行回调函数

改进

aUpdateInfo(context, payload) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      context.commit('updateInfo')
      console.log(payload)
      resolve('成功')
    }, 1000)
  })
}
updateInfo(count) {
  //this.$store.commit('updateInfo')
  this.$store
      .dispatch('aUpdateInfo', '我是携带信息')
      .then(res=>console.log(res))
}

我们这次加上一个return来返回Promise,这样一旦updateInfo执行dispatch方法时,就会跳到aUpdateInfo方法,该方法又将Promise返回到updateInfo方法,此时将then接着dispatch方法后边就是将then接Promise后边。

这样实现了双向信息的传递,首先我们通过dispatch方法传入携带信息,我们在actions里既可以使用携带信息,同时如果要给外部信息,通过可以利用返回Promise方法,将给外界的信息放在resolve参数里,不用单独在组件方法里用参数接受,通过then方法接受使用。

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
undetected-chromedriver是一个Python库,它可以帮助你在爬虫程序中使用Chrome浏览器来进行自动化操作。相比于原生的chromedriver,undetected-chromedriver有以下优点: 1. 自动处理Chrome浏览器的User-Agent、WebGL指纹、Canvas指纹等特征,减少被检测到的概率; 2. 可以模拟人类操作,比如模拟鼠标移动、键盘输入等; 3. 提供了更加友好的API,方便使用。 下面是undetected-chromedriver的使用详解: 1. 安装undetected-chromedriver 你可以使用pip来安装undetected-chromedriver: ``` pip install undetected-chromedriver ``` 2. 创建Chrome浏览器实例 ```python import undetected_chromedriver.v2 as uc driver = uc.Chrome() ``` 3. 访问网页 ```python driver.get('https://www.baidu.com') ``` 4. 查找元素 ```python from selenium.webdriver.common.by import By # 查找搜索框 search_box = driver.find_element(By.ID, 'kw') # 查找搜索按钮 search_button = driver.find_element(By.ID, 'su') ``` 5. 模拟操作 ```python from selenium.webdriver.common.action_chains import ActionChains # 模拟在搜索框中输入关键词 actions = ActionChains(driver) actions.move_to_element(search_box) actions.click() actions.send_keys('undetected-chromedriver') actions.perform() # 模拟点击搜索按钮 search_button.click() ``` 6. 获取页面内容 ```python # 获取页面源代码 html = driver.page_source # 获取当前URL url = driver.current_url ``` 7. 关闭浏览器 ```python driver.quit() ``` 总的来说,undetected-chromedriver是一个很好用的Python库,它可以帮助我们在爬虫程序中使用Chrome浏览器来进行自动化操作,并且减少被检测到的概率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值