【问题标题】:How to implement a PUT request in Vue 3如何在 Vue 3 中实现 PUT 请求
【发布时间】:2021-01-28 07:27:10
【问题描述】:

我正在尝试实现对https://crudcrud.com/ REST API 的 PUT 请求。 我有一个用户列表,当我单击更新按钮时,我想显示一个模式并允许用户更新任何字段(名称、电子邮件、图像 URL)。主要担心的是我正在为如何格式化 PUT 请求而苦苦挣扎。

这是我目前的解决方案

// template (UserCrud.vue)
<button @click="update(user._id)">Update</button>

// script
components: { Create },
  setup() {
    const state = reactive({
      users: [],
    })

    onMounted(async () => {
      const { data } = await axios.get(`/users`)
      state.users = data
    })

    async function update(id) {
      await axios.put(`/users/${id}`)
      state.users = ???
    }


    return { state, destroy, addUser }

这是一些示例数据:

[
  {
  "_id": "6012303e37711c03e87363b7",
  "name": "Tyler Morales",
  "email": "moratyle@gmail.com",
  "avatar": "HTTP://linkURL.com
  },
]

作为参考,这是我使用 POST 方法创建新用户的方式:

export default {
  components: { Modal },
  emits: ['new-user-added'],
  setup(_, { emit }) {
    const isModalOpen = ref(false)
    const state = reactive({
      form: {
        name: '',
        email: '',
        avatar: '',
      },
        })
        
    async function submit() {
      const { data } = await axios.post('/users', state.form)
      emit('new-user-added', data)
      state.form.email = ''
      state.form.name = ''
      state.form.avatar = ''
      isModalOpen.value = false
    }
    return { isModalOpen, submit, state }
  },
}

查看此repo 以获得完整的 repo:文件是 UserCrud.vue 和 Create.vue

【问题讨论】:

    标签: rest vue.js put vuejs3 vue-composition-api


    【解决方案1】:

    您应该将用户对象作为参数传递,然后通过将 id 设置为参数将其作为 put 请求的主体发送:

    <button @click="update(user)">Update</button>
    ...
    
        async function update(user) {
           let _user={...user,name:'Malik'};//example
           await  axios.put(`/users/${user._id}`,_user);
          const { data } = await axios.get(`/users`)
          state.users = data
        }
    

    您可以使用相同的代码添加新用户进行更新,方法是定义一个名为editMode 的属性,该属性在更新模式下具有true,并且基于此属性您可以执行正确的请求

    export default {
      components: { Modal },
      emits: ['new-user-added','user-edited'],
      props:['editMode','user'],
      setup(props, { emit }) {
        const isModalOpen = ref(false)
        const state = reactive({
          form: {
            name: '',
            email: '',
            avatar: '',
          },
            })
         onMounted(()=>{
               state.form=props.user;//user to edit
           }) 
        async function submit() {
         if(props.editMode){
            const { data } = await axios.put('/users/'+props.user._id, state.form)
            emit('user-edited', data)
         }else{
          const { data } = await axios.post('/users', state.form)
          emit('new-user-added', data)
          state.form.email = ''
          state.form.name = ''
          state.form.avatar = ''
        }  
        isModalOpen.value = false
        
        }
        return { isModalOpen, submit, state }
      },
    }
    

    【讨论】:

    • 嗯,我还是一头雾水。假设我想手动将 name 属性从“Tyler”更改为“Malik”。这个逻辑会去哪里?我可以看到 DELETE 如何直接从 API 中删除项目,但我不清楚 PUT 如何更新。新数据从何而来?
    • 你可以添加编辑模式来更新它们,但为了测试你可以做let _user={...user,name:'Malik'}; await axios.put...
    • 但是您必须在模态框内添加一个表单来更新所选用户,然后提交更改
    • 这确实更有意义,但现在我无法创建新用户或更新他们。你觉得这合适吗? &lt;Create @new-user-added="addUser" /&gt;&lt;button @click="update(user)"&gt;Update&lt;/button&gt;
    • 为什么不能在同一个表单中做这两个操作呢?您可以根据 editMode 属性控制添加/编辑