总结一Ajax异步复习vuex购物车案例

1.Ajax操作是异步的,相当于邮局

为什么要使用Ajax
在没有使用ajax技术时,前端要和服务器做交互是一个一来一回的过程。在前端通过HTTP协议向服务器发送请求时,要等待服务器的回应才能做下一步的操作,这给与了用户很不好的体验感。

什么Ajax
ajax是前端异步请求后台数据的技术,能做到在前端不刷新网页的情况下,获取后台数据在前端做显示,能给与用户很好的体验感。

参考文章:
Ajax异步请求
Ajax异步请求原理和过程

2.vuex知识点

在这里插入图片描述

结论

  1. 修改state状态必须通过mutations
  2. mutations只能执行同步代码,类似ajax,定时器之类的代码不能在mutations中执行
  3. 执行异步代码,要通过actions,然后将数据提交给mutations才可以完成
  4. state的状态即共享数据可以在组件中引用
  5. 组件中可以调用action

关于vuex的介绍—自己的笔记
以前的视频

smile老师的vuex博客笔记视频链接

一些知识点:
1.Vue.use(Vuex) Vue实例原型上添加$store属性

new Vue({
  render: h => h(App),
  // new Vue也提前留了一个属性叫store,可以提前放入你创建的store对象
  // 让vue项目拥有vuex功能
  //Vue原型上$store属性赋值
  store
}).$mount('#app')

2.Vue-初始化阶段
在这里插入图片描述

  data() {
    return {
      num: 0,
      b:this.num,
      c:this.$store.state.count
      //这样写是错误的undefinded,运行这行,才把变量的值挂到vue身上,不能访问this,
      //走完才有num,b,a,有点超前
      //后面一个可以是因为通过原型链找到$store
    }

注:data函数执行时,才给this身上添加data函数return对象里的属性
所以在里面this a或者this b 都是访问不到值的,没挂载你就要访问时undefined
记住不要在data函数里面写this。

3.可以在v-model绑定的值上面直接写$store.state.count吗?
不建议,vuex要求我们在mutations里面修改state状态(这样可以在调试工具里面追踪变化过程)

4.定义变量在computed:

<input type="text" v-model="count">

<script>
export default {
  computed: {
    count: {
      set(){},
      get(){
        return this.$store.state.count
      }
    }
  }
}
</script>

5.用辅助函数映射-获取state

<script>
// 需求1: 映射state到计算属性
// 1. 拿到辅助函数 mapState
// 2. 在computed内, ...mapState(['state变量名'])
// 3. 当计算属性使用

import { mapState } from 'vuex'

// let r = mapState(['count']) // 提取store里的state叫count的变量
// console.log(r); // 返回值: {count: 函数体(return state里count的值)}返回一个对象

export default {
  computed: {
    // 3.把映射过来的对象,展开放入到computed里 只有它的结构是对应的
    //count :内置函数
    // 映射count, 得到对象展开, 合并到计算属性中 解构对象
    ...mapState(['count'])
    //传入映射的变量名 ...扩展运算符展开 key value留在原地
  },
}
</script>

6.复习扩展运算符 想当于外面括号去掉了,值留在原地
格局打开---值留在原地

let a=[1,2,3]
console.log(...a) //1,2,3 外面括号去掉了
let b=[...arr,4]
...作用就是把右边的值(对象/数组),结构打散,把值放到原地
相当于let b=[1,2,3,4]

7.定义mutations
mutations是唯一能修改state的地方, 确保调试工具可以追踪变化
mutations函数内, 只能写同步代码, 调试工具可追踪变化过程
因为调试工具要立刻产生一次记录, 所以必须是同步的
小结
mutations里函数作用?--------负责修改state里的数据
mutations只能写什么样的代码?--------同步流程的代码

mutations: {
		函数名 (state, 可选值) {
			// 同步修改state值代码
		}
	}

8.使用mutations的2种方式
方式1: 组件内 - 直接使用

语法:

this.$store.commit("mutations里的函数名", 具体值)

方式2: 组件内 - 映射使用

语法:

// 1. 拿到mapMutations辅助函数
import { mapMutations } from 'vuex'
export default {
    methods: {
        // 2. 把mutations里方法映射到原地
        //等价于原地有了一个方法
        ...mapMutations(['mutations里的函数名'])
    }
}

非父子组件互相传值/通信 本质是第三方包
异步操作:不必等待代码执行

9.actions定义-异步修改
(1)actions和mutations区别?====mutations里同步修改state,actions里放入异步操作

(2)actions是否能操作state?

不建议, 要commit给mutations(为调试工具可追踪)

(3)actions和mutations里函数, 第一个形参分别是什么?

mutations的是state,actions的是store

10.使用actions的2种方式
方式1: 组件内 - 直接使用

语法:

this.$store.dispatch('actions函数名', 具体值)

方式2: 组件内 - 映射使用

语法:

// 1. 拿到mapActions辅助函数
import { mapActions } from 'vuex'
export default {
    methods: {
        // 2. 把actions里方法映射到原地
        ...mapActions(['actions里的函数名'])
    }
}

注意:mutations和ations只能接受一个参数值(如果传递多个,请传递一个完整的对象)

3.重构购物车

李旭东老师代码笔记

(1)mapState可以改变映射到原地的计算属性名吗?

可以的, 格式…mapState({'‘计算属性名’, ‘state里要映射的变量名’})

数组形式映射 ---同名
    ...mapState(['goodsList'])
{ goodsList:  映射过来函数内部返回state下的goodsList} 

对象形式:
...mapState({list: 'goodsList'}) 
自定义原地属性名list, 映射vuex里的goodsList变量值

(2) 分模块 state要变成函数的写法 return 一个对象

定义modules

语法:
modules: {
    模块名: 模块对象
}

对象形式映射 自定义名+函数格式

 computed: {
    //映射过来函数返回state
    //变量名: state=>state.模块名.变量名
    ...mapState({
      //自定义名+函数格式
      //形参state就是vuex里根store里state
      list: state => state.cart.goodsList
    })
  },

(3)分模块-命名空间
目标:
防止多个模块之间, mutations/actions/getters的名字冲突

在模块对象内设置 namespaced: true

在这里插入图片描述

unknown local action type: asyncGetGoodsList, global type: cart/asyncGetGoodsList

报错原始是因为导入模块时忘记修改了,引用文件出错!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go是下一代的互联网开发语言; Go是下一代互联网时代的C语言; Go的并发如何如何高; Go的语言如何如何简洁; 国外某公司全部由NodeJS转向Go开发; 国外某公司从ruby转向go之后,服务器数量从20多台降到了2台; Go项目开发的优点 (1)开发体验好 go的编译速度极快,可以在保存完代码后直接刷新浏览器看效果,开发体验接近动态语言。 (2)Go很容易将错误定位到代码行上 除view模版之外,go很容易将错误定位到具体的行上,方便开发人员排错。 (3)语法相对简洁 确实相对来说,能省一些代码量。 (4)很容易部署 这个很容易部署是相对.NET、Java等这些编译型语言,因为go也是编译型的,它开发的程序,不用考虑依赖,直接会生成一个.exe文件,任何平台下都可以直接运行。这也是当时很吸引我的地方。 当然,go编译后的程序也相对较大。 (5)轻量级 相对Java来讲,Go语言比较轻量级,无论是IDE还是开发、部署,都不像Java那么笨重、复杂。 (6)相对严谨 在Go中,如果你导入了一个包,但是没有用,或你定义了一个变量,后面没有使用这个变量都会报错。 本套课程从GoWeb基础讲起,并配有实战案例,内容包含:Web简介、使用Go搭建服务器、使用Go对数据库进行增删改查、使用 Go处理请求和响应以及Go的模板引擎等。实战案例的功能模块包括:登录注册、图书的增删改查、分页、购物车、订单管理等。
好的,我可以帮你解决这个问题。首先,我们需要了解购物车案例的基本流程,然后再进行Ajax改造。 购物车案例基本流程: 1. 用户点击商品的“加入购物车”按钮。 2. 系统将商品信息添加到购物车中。 3. 系统显示购物车中的商品列表和总价。 4. 用户可以继续添加商品或者结算购物车Ajax改造步骤: 1. 在“加入购物车”按钮的点击事件中,使用Ajax向后台发送请求,将商品信息添加到购物车中。 2. 在后台处理完请求后,返回购物车中的商品列表和总价,然后将这些数据返回给前端。 3. 前端收到后台返回的数据后,使用JavaScript动态更新购物车列表和总价,实现无刷新操作。 4. 用户可以继续添加商品或者结算购物车,这些操作也都可以通过Ajax实现。 下面是一个简单的Ajax购物车示例代码: 前端代码: ```html <!-- 显示商品列表 --> <div id="goods-list"></div> <!-- 显示购物车列表 --> <div id="cart-list"></div> <!-- 显示总价 --> <div id="total-price"></div> <!-- 加入购物车按钮 --> <button class="add-to-cart" data-goods-id="1">加入购物车</button> <script> $(function() { // 加入购物车按钮点击事件 $('.add-to-cart').click(function() { var goodsId = $(this).data('goods-id'); $.ajax({ url: '/cart/add', type: 'POST', dataType: 'json', data: {goodsId: goodsId}, success: function(data) { // 更新购物车列表和总价 $('#cart-list').html(data.cartListHtml); $('#total-price').text(data.totalPrice); } }); }); }); </script> ``` 后台代码: ```php <?php // 处理加入购物车请求 function addCartAction() { $goodsId = $_POST['goodsId']; // 将商品添加到购物车中 $cart->addGoods($goodsId); // 获取购物车列表和总价 $cartListHtml = $cart->getCartListHtml(); $totalPrice = $cart->getTotalPrice(); // 返回JSON格式数据 $result = array('cartListHtml' => $cartListHtml, 'totalPrice' => $totalPrice); echo json_encode($result); } ?> ``` 在这个示例中,我们使用了jQuery的Ajax方法进行请求发送和数据处理。后台代码使用了PHP语言实现,但是你也可以使用其他语言实现,例如Java、Python等等。总之,通过Ajax技术,我们可以实现无刷新操作,提升用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值