Багги движение объекта в массиве с Redux и React

Как уже упоминалось ранее, API-интерфейсы FileSystem и File , а также API FileWriter могут использоваться для чтения и записи файлов из контекст вкладки / окна браузера на клиентскую машину.

Существует несколько вещей, относящихся к API-интерфейсам FileSystem и FileWriter, о которых вы должны знать, некоторые из которых были упомянуты, но заслуживают повторения:

  • Реализации API в настоящее время существуют только в браузерах на основе хрома (Chrome & amp; Opera)
  • Оба API были сняты со стандартного трека W3C 24 апреля 2014 года , и на данный момент являются собственностью
  • . Удаление (теперь запатентованных) API-интерфейсов от реализации браузеров в будущем - это возможность
  • Песочница (местоположение на диске, за пределами которого файлы могут не производят никакого эффекта) используется для хранения файлов, созданных с помощью API.
  • Виртуальная файловая система (структура каталогов, которая необязательно существует на диске в той же форме, что и при доступе от в браузере) используются файлы, созданные с помощью API-интерфейсов

. Вот простые примеры того, как API-интерфейсы используются, прямо или косвенно, в тандеме для выполнения следующих действий:

BakedGoods *

Запись файла:

bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

Чтение файла:

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

Использование необработанного файла, FileWriter и API FileSystem

Запись файла:

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Файл чтения:

function onQuotaRequestSuccess(grantedQuota)
{

    function getfile(directoryEntry)
    {

        function readFile(fileEntry)
        {

            function read(file)
            {
                var fileReader = new FileReader();

                fileReader.onload = function(){var fileData = fileReader.result};
                fileReader.readAsText(file);             
            }

            fileEntry.file(read);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: false},
            readFile
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Хотя API-интерфейсы FileSystem и FileWriter больше не соответствуют стандартам трек, их использование может быть оправдано в некоторых случаях, на мой взгляд, потому что:

  • Возобновленный интерес у недействующих поставщиков браузеров может вернуть их обратно на него
  • Рыночное проникновение внедряющих (на основе хромовых) браузеров велико
  • . Google (главный вклад в Chromium) не дал и не закончил API API

Однако, если «некоторые случаи» охватывают ваши собственные, вы должны решить.

* BakedGoods поддерживается не кем иным, как парень прямо здесь:)

1
задан Reece Jones 18 January 2019 в 09:48
поделиться

2 ответа

Спасибо @Whitepaw,

Я обновил свой код с помощью:

_moveOneImgBack = (newArray, index) =>{

  const arrayLength = newArray.length - 1
  const newBackPlace = index == 0 ? arrayLength : index - 1

  const image = newArray[index]
  newArray.splice(index, 1)
  // const image = images.shift(index)
  newArray.splice(newBackPlace, 0, image)

  this.props.container.updateData({ images: newArray })
}

, и теперь он работает отлично, я застрял в том факте, что это может иметь какое-то отношение к редуксу immutables. Так что это указывает на неправильное использование .shift ()

0
ответ дан Reece Jones 18 January 2019 в 09:48
поделиться

... вы используете shift неправильно:

array = ['foo', 'bar', 'not', 'feeling', 'welcome', 'by jack', 'ass users']
array.shift(whatEverIndex) 

вывод всегда будет первым индексом, то есть 'foo', и потому что ваш индекс правильный и вы используете

array.splice(newIndex, 0, item)
[ 119] правильно, ваш массив меняется странным образом.

Попробуйте скопировать нужный элемент, затем удалите его с помощью .splice (), например:

const item = array[index] //copy item
array.splice(index, 1) //remove old item
array.splice(newIndex, 0, item) //place item

Забавно, что никто из вас, ребята, NaN , laruiss , Антуан Грандшамп , J-Alex нашел время, чтобы действительно сделать то, что вы должны делать в стеке с потоком ... вы знаете, помогите кому-нибудь. Черт побери, Каскарла, , Удачи, Рис, надеюсь, это решило это для тебя.

0
ответ дан Whitepaw 18 January 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: